2013-07-22 3 views
1

ВОПРОС: Мы строим сайт на очень ограниченной CMS. Нам нужно заменить определенную функцию на href привязки. К сожалению, загруженное внешнее и этот кусок кода не работает:jQuery: невозможно изменить содержимое, загруженное извне

JQuery:

$(document).ready(function() { 
    $('a[href*="show_upsell_dialog"]').each(function(e){ 
      $(this).attr('href', $(this).attr('href').replace('show_upsell_dialog(', 'more_details_1(')); 
    }); 
}); 

HTML бит:

<a href="javascript:show_upsell_dialog(1238)">Details</a> 

ВОПРОС: Почему? Как заставить его работать?

+0

Что происходит вместо этого? И если эти данные загружаются извне, этот кусок кода вызывается до фактического загрузки данных? – tymeJV

+1

Прежде всего, вам не нужна команда if ($ ('a [href * = "show_upsell_dialog"].) Length - если не найдено соответствия для .each, замены не произойдет – LorDex

+0

Ничего не происходит. Похоже, мой код не может видеть содержимое, загруженное извне - возможно, потому, что он загружается после загрузки моего кода ... – chuckfinley

ответ

1

Если вы не можете получить доступ к $ .get или обещание, возвращенного $ .get , ваши варианты очень ограничены.

Альтернативой является использование глобального обратного вызова ajax, который отключает себя, когда вызывается запрос с ожидаемыми параметрами.

function completeCallback (e, xhr, options) { 
    // updated 
    if (options.url == "/ejax-order-step/") { 
     $(e.currentTarget).off('ajaxComplete',completeCallback); 
     $('a[href*="show_upsell_dialog"]').attr('href',function(href){ 
      return href.replace('show_upsell_dialog(', 'more_details_1('); 
     }); 
    } 
} 
$(document).ajaxComplete(completeCallback); 

Обратите внимание, что этот обратный вызов требуется определить до завершения запроса, который он прослушивает.

В вашем случае, хотя, я не понимаю, почему вы не можете просто сделать это:

window.show_upsell_dialog = window.more_details_1; 
+0

Очень интересно. Попробуем заставить его работать. – chuckfinley

+0

Хотя ... Используете ли вы это, чтобы заменить Каждое появление привязанного тега, вызывающего 'show_upsell_dialog'? а не просто переопределить эту функцию своим собственным? В конце концов, она определена в окне. –

+0

Вам не нужно видеть заменяемую функцию, см. обновление. Если оно находится в окне (которое должно быть вызвано таким образом), у вас есть полный доступ к нему. –

-1

Вы можете попробовать этот код:

$(function() { 
    $('a[href*="show_upsell_dialog"]').each(function(){ 
     $(this).attr('href', $(this).attr('href').replace('show_upsell_dialog', 'more_details_1')) 
    }); 
}) 
+0

Нет, не работает – chuckfinley

+0

Можете ли вы показать свой html? –

+0

Я отредактировал мой код. Были ошибки. –

-1

Давать ваша функция имя и назвать его в SetTimeout (yourFuncName, 1000);

Если 1 секунда слишком короткий попробовать 2. Я только гадать, но SetTimeout полезно иногда ...

+0

Я надеюсь, что вы несерьезны – chuckfinley

Смежные вопросы