2012-02-28 2 views
2

У меня есть javascript-код, который нажимает на кнопку для меня. Он работает при размещении на машине 1, но при размещении на машине 2 вызов .GetElementByID возвращает Null.getElementById работает в одной среде, но не в другом

, ИС код выглядит следующим образом:

function ClickAButtonForMe() { 
    var btn = null; 
    var btnClientID = '<%= btnReset.ClientID %>'; 

    //this comes back with a valid clientID on **both** machines 
    alert("btnClientID=/" + btnClientID + "/, nodevalue=/" + nodeValue + "/"); 

    if (0 < btnClientID.length) { 
     btn = document.getElementById(btnClientID); 
    } 
    if (btn != null) { 
     //on machine 1, this works as expected 
     btn.click(); 
    } 
    else { 
     //on machine 2, i come here 
     alert("button not found"); 
    } 
} 

Декларация кнопки в моем файле ASCX выглядит следующим образом:

<div id="div_Reset" class="eventManagementButtonWrapper" runat="server"> 
     <div> 
      <asp:Button class="eventManagementButton" ID="btnReset" ValidationGroup="None" runat="server" 
       Text="Reset" /> 
     </div> 
    </div> 

Другими словами, я могу получить ClientID для моя кнопка в и окружающая среда. Но когда я пытаюсь на самом деле захватить кнопку сама, она терпит неудачу на машине 2.

Может ли кто-нибудь предложить возможные вещи, на которые можно обратить внимание при выяснении причины этого несоответствия? Я попытался изменить ClientIDMode на «Static», который ничего не делает, кроме изменения идентификатора клиента в первом сообщении отладки.

+0

Что вы хотите от кнопки? Существуют подходы, которые не зависят от захвата идентификаторов элементов. –

+0

Что нового в машинах 1 и 2? Кроме того, это только для работы в IE? 'click()' зависит от IE. –

+0

@Diodeus - большая картинка есть два элемента управления TreeView на экране. Щелчок по кнопке сместит выбранные узлы из дерева слева в дерево справа. Я пытаюсь автоматизировать их с помощью этого действия, когда пользователь нажимает на дерево. Функциональность работает на моей локальной машине, но не на машине развертывания. – JosephStyons

ответ

1

Убедитесь, что выражение «% = btnReset.ClientID%>» выражает одинаковые значения ClientID в обоих случаях. Похоже, вы используете эту разметку внутри WebUserControl, чей идентификатор (и идентификатор клиента) также вычисляется соответствующим образом.

В качестве универсального решения, вы можете использовать свой подход от this резьбы:

<asp:Button ... ID="btnReset" OnInit="btnReset_Init" /> 

protected void btnReset_Init(object sender, EventArgs e) { 
    Button btn = (Button)sender; 
    string script = string.Format("var _{0} = document.getElementById('{1}');", btn.ID, btn.ClientID); 
    Page.ClientScript.RegisterStartupScript(Page.GetType(), "ANY_KEY", script, true); 
} 

<script language="javascript" type="text/javascript"> 
function ClickAButtonForMe() { 
    //alert(_btnReset); 
    _btnReset.click(); 
} 
</script> 
1

Это странно. Вы пробовали изменения ClientIDMode в «Static» и это изменить:

'<%= btnReset.ClientID %>' 

просто:

btnReset 

После ClientIDMode является «Static», жерех ничего не добавляет к идентификатору элемента управления и оставляет его, как вы его назвали.

В моем опыте, когда '<% =' не работает. Я пытаюсь использовать '<% #' (не хэш-тег). Однако это может решить проблему на одной машине и создать ее с другой. Поэтому попробуйте мое первое предложение и посмотрите, помогает ли оно.

0

Только один сценарий вызовет эту ситуацию на разных машинах:

«Вы называете функцию ClickAButtonForMe пока DOM не готово»

+0

Это имеет смысл, но это инициированное пользователем действие, которое происходит много секунд после завершения страницы Лоа динь. Есть ли что-нибудь, что может привести к тому, что DOM останется неработающим в течение длительного периода времени? – JosephStyons

1

Вот некоторые предложения для некоторых вещей, которые могут пойти не так и вызвать окружающую среду определенных расхождения , обратите внимание: большинство из них не являются специфическими только для вашей проблемы.

  • Очистить кэш на всех броузерах.
  • Проверьте версии всех браузеров.
  • Сравните выходной HTML в браузерах.
  • Является ли тот же (или, аналогично похожий) пользователь вошел в систему.
  • Имеют ли они одну и ту же страницу?
  • Это один и тот же URL-адрес или две разные размещенные копии одного и того же кода?
    • Если это разные копии кода, убедитесь, что это та же версия
  • В зависимости от условий (и типа приложения) сделать сброс IIS, чтобы убедиться, что правильные DLL файлы загружаются.
  • Вы используете версию отладки/выпуска в одной из сред?
  • Запускаете ли вы IN отладку в одной из сред?
  • Является ли DOM полностью загруженным в обоих случаях? (состояние гонки?)
Смежные вопросы