2015-01-26 5 views
0

У меня есть ретранслятор asp.net, который создает неупорядоченный список объектов гиперссылки. Я пытаюсь использовать Jquery для захвата значения «Текст» данной гиперссылки для гнусных целей, чтобы прийти позже.Невозможно получить свойство asp.net Текстовое свойство с JQuery

Вот репитер создает свой список O»ссылок:

<ul class="links"> 
    <asp:Repeater Runat="server" ID="_items" EnableViewState="false"> 
     <ItemTemplate> 

      <li> 
       <asp:HyperLink ID="HyperLink1" runat="server" Text='[Eval]' NavigateUrl="#" onclick="return aClick();" /> 
      </li><br /> 

     </ItemTemplate> 
    </asp:Repeater> 
</ul> 

... и Javascript для этой функции aClick():

function aClick() { 
    alert("Click " + $(this).text()); 
    return false; 
} 

Все я получаю, когда это работает это предупреждение который читает «Щелчок». Текст из объекта, который вызвал функцию, не возвращается (и да, все мои ссылки имеют текст.)

Я пробовал event.target для JQuery docs, я пробовал event.srcElement (хотя я использую Chrome), и я попытался переместить $ (this) .text() в отдельную переменную в начале функции, а затем ссылаться на переменную в своем предупреждении. Я пробовал JQuery 1.8.2 и 1.11.2. Ничего.

Я вижу из инструментов dev, что $ (this) относится к глобальному окну, а не к объекту, вызвавшему событие, поэтому ясно, что мне нужна помощь в выяснении того, как исправить это.

ответ

1

this не сохраняется при вызове функции от встроенного обработчика onclick. Вы должны передать его:

Используйте это:

onclick="return aClick(this);" 

и

function aClick(link) { 
    console.log("Click " + $(link).text()); 
    return false; 
} 

При использовании JQuery я настоятельно рекомендую вам не использовать встроенные обработчики, так как они отделяют регистрацию обработчика кода из обработчик без уважительной причины. Для упрощения обслуживания используйте обработчики событий jQuery:

например.

$(function(){ 
    $('.links a').click(function(){ 
     console.log("Click " + $(this).text()); 
     return false; 
    } 
}); 

Примечания:

  • $(function(){...}); это просто ярлык для $(document).ready(function(){...});
  • Не используйте alert в отладке click событий (это только мешает). Вместо этого используйте console.log (но не забудьте удалить их для выпуска, так как не отлаживаемый IE будет разбиваться, поскольку консоль не определена, если у вас нет инструментов отладки).

Если вы хотите, чтобы поддерживать динамические элементы, изменить его, чтобы быть делегирован обработчиком события, связанный с не меняющимся предком, используя on так:

$(function(){ 
    $('.links').on('click', 'a', function(){ 
     console.log("Click " + $(this).text()); 
     return false; 
    } 
}); 

Это поддерживает ссылки добавлены позже и имеет более низкую накладную (только один обработчик, подключенный при запуске), и любая дополнительная задержка во время события незаметна, так как вы просто не можете щелкнуть 50 000 раз в секунду :)

+0

Спасибо, что расчистили это. Оба ваших примера работают, но, к сожалению, второй (с обработчиком, включенным в поле $ (function() {'), открывается окно с двойным щелчком - предупреждение, я нажимаю ok, открывается второе окно предупреждения. – bmurrell30

+0

@ bmurrell30: Я бы также посоветовал использовать 'console.log' для отладки событий кликов, а не' alert':) –

0

Попробуйте следующее:

$('[id$=_items]').find('[id*= HyperLink1]').click(function(event){ 
    alert($(this).text()); 
}); 
Смежные вопросы