Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Не работает обработка ajax


Автор: baryshkov 5.11.2012, 09:12
Здравствуйте, на странице вставляю данные черех ajax 
Код

$("#resp_form_"+obj_id).html(html);

Но после того как на странице подгружаеться моя форма, ее обработки ajax не обрабатывают. Например у меня там есть
Код

jQuery("#productRate").click

Не отрабатывает. Все обработка ajax прописана в главной странице. В чем может быть проблема?

Автор: ksnk 5.11.2012, 09:58
Причина в том, сто click выставляется в тот момент, когда элемента #productRate еще нет или его в результате запроса заменят на другой.

Решение
Код

$(document).on('click','#productRate', function(){...})

Автор: baryshkov 5.11.2012, 12:19
Цитата(ksnk @ 5.11.2012,  09:58)
Причина в том, сто click выставляется в тот момент, когда элемента #productRate еще нет или его в результате запроса заменят на другой.

Решение
Код

$(document).on('click','#productRate', function(){...})

А по мимо события onclick какие еще заранее не отрабатывают? Хотя наверно все события несуществующего объекта!

Автор: ksnk 5.11.2012, 12:57
Цитата(baryshkov @  5.11.2012,  12:19 Найти цитируемый пост)
Хотя наверно все события несуществующего объекта!

 smile 

Автор: baryshkov 6.11.2012, 07:33
Цитата(ksnk @ 5.11.2012,  12:57)
Цитата(baryshkov @  5.11.2012,  12:19 Найти цитируемый пост)
Хотя наверно все события несуществующего объекта!

 smile

А как быть с такой конструкцией?
Код

jQuery(document).ready(function($) {
  $('a[rel*=facebox]').facebox({
    loadingImage : '/images/indicator.gif',
    closeImage   : '/images/close_grey.png'
  })
})

Автор: Aliance 6.11.2012, 10:39
baryshkov, если она не работает (хотя по хорошему, должна), то примерно так:
Код

jQuery(document).ready(function($) {
  initFacebox();

  $.post('url', {}, function() {
    $("#resp_form_"+obj_id).html(html);
    initFacebox();
  });
})

function initFacebox() {
  $('a[rel*=facebox]').facebox({
    loadingImage : '/images/indicator.gif',
    closeImage   : '/images/close_grey.png'
  })
}

Автор: baryshkov 6.11.2012, 11:11
Цитата(Aliance @ 6.11.2012,  10:39)
baryshkov, если она не работает (хотя по хорошему, должна), то примерно так:
Код

jQuery(document).ready(function($) {
  initFacebox();

  $.post('url', {}, function() {
    $("#resp_form_"+obj_id).html(html);
    initFacebox();
  });
})

function initFacebox() {
  $('a[rel*=facebox]').facebox({
    loadingImage : '/images/indicator.gif',
    closeImage   : '/images/close_grey.png'
  })
}

Да не отрабатывает когда в див подгружаю. А если код сразу на страницу вывести а не ajax подгружать то работает!

А ваш код работает ))))

Автор: baryshkov 13.11.2012, 14:34
Цитата(ksnk @ 5.11.2012,  09:58)
Причина в том, сто click выставляется в тот момент, когда элемента #productRate еще нет или его в результате запроса заменят на другой.

Решение
Код

$(document).on('click','#productRate', function(){...})

Что то так не получаеться ((((

Автор: Aliance 13.11.2012, 14:41
Код

alert( $.fn.jquery )

Что выводит?

Автор: baryshkov 13.11.2012, 14:55
Цитата(baryshkov @ 13.11.2012,  14:34)
Цитата(ksnk @ 5.11.2012,  09:58)
Причина в том, сто click выставляется в тот момент, когда элемента #productRate еще нет или его в результате запроса заменят на другой.

Решение
Код

$(document).on('click','#productRate', function(){...})

Что то так не получаеться ((((

т.е. каким образом так повешать событие hover - при наведение и выходе???

Автор: Aliance 13.11.2012, 15:01
Такого события нет. Есть события mouseover/mouseout, а есть jQuery метод hover, который биндит из оба. Уточни что тебе нужно получить.

Автор: baryshkov 13.11.2012, 15:03
Цитата(Aliance @ 13.11.2012,  14:41)
Код

alert( $.fn.jquery )

Что выводит?

1.4.4

Автор: Aliance 13.11.2012, 15:10
Если бы ты зашел сперва в http://api.jquery.com/on/, то увидел бы, что эта фича введена в версии 1.7
Цитата

version added: 1.7


Я бы конечно рекомендовал обновится, на дворе уже 1.8, а ты все еще в динозаврах. Но если слишком много зависимостей, то можно заменить on на delegate
Цитата

 As of jQuery 1.7, the .on() method provides all functionality required for attaching event handlers. For help in converting from older jQuery event methods, see .bind(), .delegate(), and .live().

Автор: baryshkov 13.11.2012, 19:28
Цитата(Aliance @ 13.11.2012,  15:10)
Если бы ты зашел сперва в http://api.jquery.com/on/, то увидел бы, что эта фича введена в версии 1.7
Цитата

version added: 1.7


Я бы конечно рекомендовал обновится, на дворе уже 1.8, а ты все еще в динозаврах. Но если слишком много зависимостей, то можно заменить on на delegate
Цитата

 As of jQuery 1.7, the .on() method provides all functionality required for attaching event handlers. For help in converting from older jQuery event methods, see .bind(), .delegate(), and .live().

Спасибо!

Автор: baryshkov 13.11.2012, 22:08
Цитата(Aliance @ 13.11.2012,  15:01)
Такого события нет. Есть события mouseover/mouseout, а есть jQuery метод hover, который биндит из оба. Уточни что тебе нужно получить.

После загрузки в див формы, хочу сделать оценку товара. рисую 5 звез, хочу что бы по ним двигали и они красились. Нажал и остановились.
Но что то мерчает сильно курсор
Код

#productRate {background:url(../images/stars.png);width:150px;height:30px;position:relative;}
#productRate div {background:url(../images/stars.png) left bottom;width:0; height: 100%; position: absolute;    top: 0;    left: 0; z-index: 1;cursor: pointer;}
#productRate span {display:block;    height: 100%;position:absolute;top:0;left: 0;z-index: 2;background: url(../images/stars.png)left center;width:0;cursor:pointer;}
.objRate_black{background:url(../images/stars.png);width:150px;height:30px;position: relative;}
.objRate{background:url(../images/stars.png) left bottom;width:0;height:100%;position: absolute;top:0;left:0;z-index:1;}

$(document).on('submit', "#form_resp_ajax", function(ev){
    
    var old_text = $("#form_resp_ajax .btn").html();
    $("#form_resp_ajax .btn").html(img1_loading);    
    $("#form_resp_ajax .btn").addClass("disabled").attr("disabled",true);            

    $.ajax({
              type: "post", 
              url: "/java/ajax/add_response.html", 
              data:$("#form_resp_ajax").serialize(), 
              success:function(html){        
                     $("#facebox_content").html(html);
                     alert(html);
                }
              
              , 
              complete:function(html){   
                    $("#form_resp_ajax .btn").html(old_text);    
                    $("#form_resp_ajax .btn").addClass("disabled").attr("disabled",false);    
              }
    });

    ev.preventDefault();
});
$(document).on("mouseenter", "#productRate",
    function(e){ 
        $(this).append("<span></span>");
    }
);
$(document).on("mouseover", "#productRate",
    function(e){ 
    

        if (!e) e = window.event;
      if (e.pageX){
            x = e.pageX;
             } else if (e.clientX){
             x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
          
         }
         var posLeft = 0;
         var obj = this;
        while (obj.offsetParent)
         {
             posLeft += obj.offsetLeft;
             obj = obj.offsetParent;
         }
         var offsetX = x-posLeft,
             modOffsetX = 5*offsetX%this.offsetWidth; 
             rating = parseInt(5*offsetX/this.offsetWidth);
    
         if(modOffsetX > 0) rating+=1;
         
         $(this).find("span").eq(0).css("width",rating*30+"px"); 
            $("#rating-label_0").css("display","none");
            for (i=1;i<=5;i++){
                $("#rating-label_"+i).css("display","none");
            }
            $("#rating-label_"+rating).css("display","block");
    }
);
$(document).on("mouseout", "#productRate", function()
    { 
    
        $(this).find("span").remove();
        for (i=1;i<=5;i++){
            $("#rating-label_"+i).css("display","none");
        }
        $("#rating-label_0").css("display","block");
    }
);
$(document).on("click","#productRate", function(){ 
    
        get_obj("o_resp").value = rating;
     $(this).find("div").eq(0).css("width",rating*30+"px");
        $("#rating-label_0").css("display","none");
        return false;
}); 

<div id="productRate">
                    <div id="select_stars" ></div>
                </div>


До того как было Hover все хорошо работало ((((

Автор: Aliance 14.11.2012, 10:16
Как на этом форуме? (в каждом посте, после даты)

Вот это
Код

if (!e) e = window.event;

писать не нужно, на то и есть плюс jQuery, что он сам делает работу по кроссбраузерности.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)