2012-04-17 7 views
18

Вот что у меня есть уже:JQuery нажмите событие работает только один раз

<html> 
    <head> 
    <link rel="stylesheet" type="text/css" href="reset.css" /> 
    <script src="jquery.js"></script> 
    <script> 
     $(function() { 
      // Page Load 
      //// Set default size of canvas 
      var canvas_height = 124; 
      var canvas_width = 124; 
      //// Set starting point and first option point 
      $('#canvas div:first-child').addClass('start'); 
      $('#canvas div:nth-child(2)').addClass('option'); 
      GenerateIDs(); 

      $('#btnID').click(function(){ 
       GenerateIDs(); 
      }); 

      // Generates IDs dynamically 
      function GenerateIDs(){ 
       var row = 0; 
       var col = 0; 
       var lastdivposition = 0; 
       $('#canvas div').each(function(){ 
        if ($(this).position().top > lastdivposition) 
        { 
         row += 1; 
         col = 1; 
        } 
        else 
         col += 1; 
        $(this).attr('id', row + '-' + col); 
        lastdivposition = $(this).position().top 
       }); 
      } 

      $('.option').click(function(){ 
       if($(this).attr('id').split('-')[0] != $(this).next().attr('id').split('-')[0]) 
       { 
        $('.option').each(function(){ 
         $(this).removeClass('option'); 
        }); 
        AddDivs('c') 
        GenerateIDs(); 
        $(this).removeClass('option').removeClass('blank').addClass('object'); 
        //$(this).next().addClass('option'); 
        $('.object').each(function(){    
         if($('#' + $(this).attr('id').split('-')[0] + '-' + (parseInt($(this).attr('id').split('-')[1]) + 1)).hasClass('blank')) 
          $('#' + $(this).attr('id').split('-')[0] + '-' + (parseInt($(this).attr('id').split('-')[1]) + 1)).removeClass('blank').addClass('option'); 
         if($('#' + (parseInt($(this).attr('id').split('-')[0]) + 1) + '-' + $(this).attr('id').split('-')[1]).hasClass('blank')) 
          $('#' + (parseInt($(this).attr('id').split('-')[0]) + 1) + '-' + $(this).attr('id').split('-')[1]).removeClass('blank').addClass('option'); 
        }); 
       } 
      }); 

      // Adds row if type = r, column if type = c 
      function AddDivs(type){ 
       if(type == 'r') 
       { 
        canvas_height += 62; 
        $('#canvas').children('div').each(function(){ 
         if($(this).position().top == $('#canvas div:first-child').position().top) 
          $('#canvas').append('<div class="blank"></div>'); 
        }); 
        $('#canvas').css('height', canvas_height + 'px'); 
       } 
       if(type == 'c') 
       { 
        canvas_width += 62; 
        $('#canvas').children('div').each(function(){ 
         if($(this).position().left == $('#canvas div:first-child').position().left) 
          $('#canvas').append('<div class="blank"></div>'); 
        }); 
        $('#canvas').css('width', canvas_width + 'px'); 
       }      
      } 
     }); 
    </script> 
    <style> 
     #canvas, #toolbox {float:left; height:124px; margin:25px; padding:5px; width:124px;} 
     .blank {background-color:gray;} 
     .start {background-color:green;} 
     .object {background-color:blue;} 
     .option {background-color:yellow;} 
     body div {border:1px solid black;} 
     body div div {float:left; height:50px; margin:5px; width:50px;} 
    </style> 
</head> 

<body> 
    <div id="toolbox"> 
     <div></div> 
     <div></div> 
     <div></div> 
     <div></div>   
    </div> 
    <div id="canvas"> 
     <div class="start"></div> 
     <div class="option"></div> 
     <div class="blank"></div> 
     <div class="blank"></div> 
    </div> 
    <br /><br /> 
    <div style="background-color:#AAAAAA; clear:left;"> 
     <input id="btnID" type="button" value="Generate IDs" /> 
     <input id="btnAddRow" type="button" value="Add Row" /> 
     <input id="btnAddCol" type="button" value="Add Col" /> 
     - LEGEND: 
     <span style="color:green; font-size:20px; font-weight:bold;">START</span> 
     <span style="color:yellow; font-size:20px; font-weight:bold;">OPTION</span> 
     <span style="color:blue; font-size:20px; font-weight:bold;">OBJECT</span> 
    </div> 
</body> 
</html>​ 

(а вот jsFiddle его в эксплуатацию; http://jsfiddle.net/DUCY3/1/)

В основном в долгосрочной перспективе он должен продолжать добавлять столбцы/строки, когда вы нажимаете желтый. Но во второй раз это даже не воспринимается событие click. Не знаю, почему. Благодарю.

+3

В будущем, пожалуйста, не * просто * включить ссылку на jsFiddle. Ваше сообщение должно быть автономным от любого другого ресурса; подумайте, что произошло бы, если бы jsFiddle спустился в будущем. – Matt

ответ

25

Вы должны изменить эту строку:

$('.option').click(function() { //etc 

к

$('.option').live('click', function(){ //etc 

Это гарантирует, что все 'вариант' коробки получит событие OnClick. Обратите внимание, что live-метод был заменен в более поздних версиях jQuery с 'on'. См http://api.jquery.com/on/

EDIT: для использования с «на» использование делегированы событий - что-то вроде этого:

$('#canvas').on('click', '.option', function() { 
    //event handler... 
} 
+2

На самом деле делегировать() или on() было бы лучше, так как live устарел в версиях jQuery 1.7+ –

+1

@JayBlanchard поэтому почему я сказал это в своем ответе! Я сказал «жить», потому что его jsFiddle использовал jQuery 1.5 – Simon

+0

Я использую 1.7.1 локально (просто повысил его до 1.7.2 сейчас). Живые работы и On - нет. $ ('. option'). on ('click', function() { – Ber53rker

15

Я хотел бы использовать функции делегата (только в случае, если вы когда-либо выбрать для обновления до новой версии JQuery),

$(document).delegate('.option', 'click', function(){ 
    //etc 
}); 

2017 Редактирование: функции делегата устарели, правильное использование будет теперь

$(document).on('click', '.option', function(){ 
    //etc 
}); 
+1

Это это лучший ответ. – VSG24

+1

A голова до кого-либо, использующего jq3.0 + - ["Как и jQuery 3.0, .delegate() устарел."] (http://api.jquery.com/delegate/) –

+0

Работы –

-4

это сделать ...

$('#canvas').live('click', '.option', function() { 
    //event handler... 
} 
+1

Это улучшение по любому из существующих ответов? Я так не думаю, плюс использование «живого» является архаичным на данный момент. – patricksweeney

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