Вызов Javascript на странице после ее загрузки с помощью jQuery GET - PullRequest
0 голосов
/ 10 ноября 2009

Представьте себе нормальную страницу, вызывающую javscript в голове. Проблема в том, что часть контента не загружается, пока я не нажму на ссылку. Впоследствии, когда эта ссылка загружает контент, она не будет работать. Это потому, что я полагаю, что javascript уже запущен и поэтому не присоединяется к тем элементам, которые вызываются позже. Вызывается только стандартный html.

Так, например, это код, который вызывает мой внешний HTML.

$.get('content.inc.php', {id:id}, function(data){
        $('#feature').children().fadeTo('fast', 0).parent().slideUp('slow', function(){
           $(this).html(data).slideDown('slow');
        });
    });

Если html, который я звонил, например, и тег H1 уже был на странице, cufon будет работать. Однако, поскольку я загружаю контент с помощью вышеуказанного метода, теги H1 не будут изменены с моим выбранным шрифтом. Это только пример. То же самое относится к любому javascript.

Мне было интересно, есть ли способ обойти это, не вызывая javascript, а также HTML, когда он получен из вышеупомянутой функции

Ответы [ 5 ]

3 голосов
/ 10 ноября 2009

Если вы хотите прикрепить события к динамически создаваемым элементам на странице, взгляните на ключевое слово "live".

$('H1').live("click", function() { alert('it works!'); });

Надеюсь, это то, что вы искали.

1 голос
/ 10 ноября 2009

Cufon.refresh() делает то, что вы хотите?

Как вы сказали, Cufon был просто примером , я бы также предложил более общее:

$.get(url, options, function(html, status) {
    var dom = $(html);
    // call your function to manipulate the new elements and attach
    // event handlers etc:
    enhance(dom);

    // insert DOM into page and animate:
    dom.hide();
    $target_element.append(dom); // <-- append/prepend/replace whatever.
    dom.show(); // <-- replace with custom animation
});
0 голосов
/ 10 марта 2011

JavaScript не выполняется из-за соображений безопасности ИЛИ потому что jQuery просто устанавливает innerHTML этого элемента в некоторый текст (который не интерпретируется как JavScript), если он содержится. Таким образом, безопасность является побочным эффектом.

Как это решить?

попробуйте найти все теги SCRIPT в вашем ответе и выполнить их как пара:

var scripts = myelement.getElementsByTagName("SCRIPT");
var i = 0;

for (i = 0; i < scripts.length; i++)
   eval(scripts[i].innerHTML);
0 голосов
/ 10 ноября 2009

Энди, попробуй это. Он будет вызывать код Cufon после завершения каждого AJAX-запроса и до фактического добавления html на страницу.

$.get('content.inc.php', {id:id}, function(data){
    $('#feature').children().fadeTo('fast', 0).parent().slideUp('slow', function(){
        $(this).html(data);
        Cufon.replace('h1');
        $(this).slideDown('slow');
    });
});
0 голосов
/ 10 ноября 2009

Вы можете прикрепить обработчики событий к данным, которые вы получаете через get() внутри функции обратного вызова. Например

$.get('content.inc.php', {id:id}, function(data){
    $('#feature').children().fadeTo('fast', 0).parent().slideUp('slow', function(){        
        $(this).html(data).find('a').click(function(e) {
            // specify an event handler for <a> elements in returned data
        }).end().slideDown('slow');
    });
});

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

...