изменение привязки тега href, загружаемого через ajax

#javascript #jquery #asp.net #ajax

#javascript #jquery #asp.net #ajax

Вопрос:

По сути, у меня есть представление сетки, которое я просматриваю через сервер, а не в памяти, проблема в том, что каждая строка в представлении сетки имеет URL-адрес, который я изменяю с помощью javascript, серверный элемент управления, который я использую для этого столбца в asp: поле гиперссылки. Причина, по которой это должно быть сделано в динамическом javascript, заключается в том, что я должен экранировать параметр, который добавляется к url в качестве параметра запроса, потому что в нем могут быть хэш-теги.Итак, мой javascript:

 $('#<%=grid1.ClientID%> a').each( function(){
 var url=   $(this).attr("href");
    var parameter =//this line gets the parameter from the url
  url= "Page.aspx?param=" escape(parameter);
  $(this).attr("href", url);
});
  

Это работает при загрузке первой страницы с URL-адресами, которые изначально хранятся в gridview, но поскольку я выполняю подкачку на сервере и использую ajax (asp.net updatepanel) также, поэтому на следующей странице не запускается javascript, поскольку он не обновляет страницу. Я думаю, что здесь вступит в игру jquery live, но не уверен, что это точно, потому что я думаю, что событие должно быть запущено, чтобы инициировать живой обработчик

Ответ №1:

Нет, к сожалению live , обработчики не будут работать для изменения фактического href. Однако, если вы немного измените свой подход, вы можете получить тот же эффект.

 $('#<%=grid1.ClientID%> a').live('click', function(e) {
    e.preventDefault();
    var url = $(this).attr("href");
    var parameter =//this line gets the parameter from the url
    url = "Page.aspx?param=" escape(parameter);
    window.location = url;
});
  

Таким образом, вместо изменения фактического атрибута для каждой ссылки вы переопределяете поведение, связанное с переходом по этой ссылке.

Комментарии:

1. этот подход работает, только одно изменение, поскольку я использую IE e.preventDefault() должен быть заменен на e.returnValue=false

2. @Jake: Ты уверен? e.preventDefault() это функция jQuery, которая должна быть совместима со всеми браузерами.

3. @Jake: на этой странице даже не упоминается jQuery. jQuery заботится о переводе .preventDefault() во все, что требуется текущим браузером. Попробуйте этот пример с помощью Internet Explorer: jsfiddle.net/ZQMfj/3

4. может быть, я забыл добавить e в параметры функции, но поскольку returnvalue =false работает, я не вижу причин его менять .. хотя спасибо

5. @Jake: Пока все ваши пользователи будут использовать только IE, это нормально.