jQuery - запускать скрипт jQuery каждый раз, когда вызывается функция ".load"? - PullRequest
0 голосов
/ 28 сентября 2011

Я занимаюсь разработкой контрольной панели для проекта, и у меня возник конфликт с некоторым моим кодом.Я использую jQuery, чтобы каждая ссылка вставляла содержимое запрашиваемой страницы в DIV.Этот код находится на странице index.php, поэтому он будет первым на странице, которая будет запущена, несмотря ни на что.На самом деле вы никогда не уходите от индекса.

$('a').live("click",function(){
var external = $(this).attr('class');
if (external == "externalLink") {
return true;
}
var page = $(this).attr('href');
if (!(page == "#") && (page)) {
    $("#loading").fadeToggle("fast", "linear");
    $("#split-view-right #content").load(page, function(){
        var parentHeader = $("#split-view-right #content #parentHeader").html();
        $("#split-view-right #header").html(parentHeader);  
        $("#loading").fadeToggle("fast", "linear");
    });
}
return false;
});

В #header у меня также есть некоторый код, в том числе некоторые кнопки.Некоторые из них у меня есть просто ссылка на страницу, которая прекрасно работает, но некоторые мне нужно запустить скрипт.Когда я пытаюсь определить скрипт для запуска на одной из этих страниц, он не найдет кнопку, если я не запустил ее с «.live».Проблема в том, что когда я пытаюсь перейти на другую страницу после запуска этого сценария, он игнорирует гиперссылку и снова запускает этот код.Вот пример запускаемого кода.

$(function() {
$("#headerbutton").live('click', function() {
    $("#loading").fadeToggle("fast", "linear");
    var title = $("input#title").val();
    var partnum = $("input#partnum").val();
    var descript = $("textarea#descript").val();    
    var startprice = $("input#startprice").val();
    var minprice = $("input#minprice").val();
    var domship = $("input#domship").val(); 
    var intship = $("input#intship").val();
    var startdate = $("input#startdate").val();
    var droprate = $("input#droprate").val();   
    var dataString = 'title='+title+'&partnum='+partnum+'&descript='+descript+'&startprice='+startprice+'&minprice='+minprice+'&domship='+domship+'&intship='+intship+'&startdate='+startdate+'&droprate='+droprate;    
    $.post("savenewproduct.php",
    { "title": title, "partnum": partnum, "descript": descript, "startprice": startprice, "minprice": minprice, "domship": domship, "intship": intship, "startdate": startdate, "droprate": droprate },     
    function(postdata){
        $("#split-view-right #content").load('upload_images.php?id=' + postdata.newID, function(){
            var parentHeader = $("#split-view-right #content #parentHeader").html();
            $("#split-view-right #header").html(parentHeader);  
            $("#loading").fadeToggle("fast", "linear");
        });
    }, "json");
    return false;
});
});

То, что я хотел бы попробовать (если нет лучшего решения), это сделать так, чтобы каждый раз, когда я запускаю «.load», яможно запустить скрипт .die, чтобы отменить предыдущие живые коды на этой странице.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 28 сентября 2011

Не уверен, помогает ли это или нет, но вы можете попробовать и использовать:

$('a:not(.external)').live("click", function(e){
    e.preventDefault();
    ....
}

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

1 голос
/ 28 сентября 2011

Я не уверен, достаточно ли я понял ваши данные, но вот что я извлекаю из этого.

Во-первых, похоже, что .one() спасло бы вас здесь, если бы не требование .live(). Если вам удастся провести рефакторинг своего кода, чтобы вы могли воспользоваться .one(), это было бы здорово.

За исключением этого, почему бы просто не прикрепить вызов .die() к обратному вызову вашей .load() функции? Из того, что я вижу, ваш код в основном:

$('#headerbutton').live('click', function() {
    // some stuff
    $.post(foo, bar, function () {
        $("#split-view-right #content").load(herp, function () {
             // some stuff
             // some more stuff
             // ...
             // what's stopping you from doing something like this:

             $('#headerbutton').die('click');
        });
    });
});

Это фактически отменит обработчик .live() на вашем #headerbutton.

1 голос
/ 28 сентября 2011

Прежде всего, следующий код может быть упрощен:

$('a').live("click",function(){
  var external = $(this).attr('class');
  if (external == "externalLink") {
    return true;
  }
  ...

становится

$('a:not(.external)').live("click",function(){
  ...

Что касается проблемы с загрузкой сценариев, если вы загружаете страницу, содержащую сценарии, убедитесь, что сценарии всегда располагаются после элементов, которые они изменяют. $(function(){}); здесь на самом деле вам не поможет, потому что событие DOMReady уже было запущено при загрузке основного индекса.

0 голосов
/ 28 сентября 2011

я бы использовал bind () для любого пользовательского ввода, создающего load ()

http://api.jquery.com/bind/

...