2013-05-13 2 views
0

У меня есть требование, когда я должен запускать событие click на заголовке таблицы при щелчке другого заголовка таблицы (две разные таблицы), но триггер не запускается в таблице, когда в петля. Хотя, если я жестко привязываю триггер к отдельному элементу, он работает.Событие триггера щелчка при щелчке другого элемента в цикле

В настоящее время JS выглядит как что-то вроде этого:

var outsideHeaders = $("#header th"); 
var tableHeaders = $(".dataTable th"); 

for(var cnt = 0; cnt< outsideHeaders.length; cnt++) 
{ 
    $(outsideHeaders[cnt]).bind('click',function(){ 
     $(tableHeaders[cnt]).trigger('click'); 
    }); 
} 

Просьба предоставить решение для этого!

Обновлено:
Это как мой код выглядит в настоящее время:

var outsideHeaders = $("#header th"); 
var tableHeaders = $(".dataTable th"); 

for(var cnt = 0; cnt< outsideHeaders.length; cnt++) 
{ 
    (function(headerCnt){ 
     $(outsideHeaders[headerCnt]).bind('click',function(){ 
      $(tableHeaders[headerCnt]).trigger('click'); 
    }); 
    })(cnt); 
} 
+0

Вы не должны определять функцию внутри цикла. –

+0

@DerekHenderson Если вы собираетесь сделать заявление о том, что они не должны что-то делать, самое меньшее, что вы можете сделать, это сказать, почему они не должны (и, возможно, даже то, что они должны делать). –

+0

@ AnthonyGrist, да, вы правы, так как этот сайт посвящен информированию и обучению, я должен быть более конструктивным. –

ответ

2

Значение cnt внутри функции обработчика события щелчка будет равен его последнее значение в цикле for (в данном случае, независимо header.length было, когда код выполняется) из-за способом определения объема в работах JavaScript. Вы должны использовать замыкание, так что она сохраняет свое значение для этой конкретной итерации:

$(document).ready(function() { 
    var outsideHeaders = $("#header th"); 
    var tableHeaders = $(".dataTable th"); 

    for(var cnt = 0; cnt < outsideHeaders.length; cnt++) 
    { 
     (function(headerCount) { 
      $(outsideHeaders[headerCount]).bind('click',function(){ 
       $(tableHeaders[headerCount]).trigger('click'); 
      }); 
     })(cnt); 
    } 
}); 

Обратите внимание, что я обернутый код в $(document).ready() вызова. Это гарантирует, что эти элементы существуют, когда вы попытаетесь их выбрать.

+0

Пробовал это, но все еще не работает .. Предполагая, что это функция (cnt) вместо функции (headerCount) в коде, который вы упомянули –

+0

@SomeswaraSiripuram Вы можете назвать параметр анонимной функции, что угодно, но я пошел на что-то другое чем 'cnt', чтобы проиллюстрировать, что он относится к тому, что передается функции, а не счетчик для цикла' for'. В любом случае, код должен работать - можете ли вы проверить, что обработчик события 'click' является фактически выполненным; он может запускать код до фактического существования элементов. –

+0

Благодарим вас за ответ. Но я сожалею, что не понимаю, как параметр анонимной функции будет удерживать текущий индекс цикла for. Не следует ли присваивать индекс, а затем передавать анонимную функцию.Я попробовал это (присвоение индекса и использование того же кода выше). Дайте мне знать Если я что-то неправильно понял или пропустил. Также я проверил, что событие click выполнено. Как я уже упоминал, он работает, если я вручную назначил счетчик путем жесткого кодирования индекса для всех экземпляров и не работает в цикле –

1

Нет необходимости в создании итерации. Я думаю, это может быть правильный путь здесь:

outsideHeaders.on("click", function() { 
    var cnt = outsideHeaders.index(this); 
    tableHeaders.eq(cnt).trigger("click"); 
}); 

Вы просто связать click событие для всех outsideHeaders и вызвать click событие соответствующего элемента tableHeaders на основе индекса.

+0

это не работает. событие клика по-прежнему не запускается –

+0

@SomeswaraSiripuram. Тогда вы не привязываете его. – VisioN

+0

Рабочий стол для таблицыHeaders работает. Я проверил это. Также, как я уже сказал, он работает, если я жестко кодирую индекс, но не внутри цикла .... !!!! –

2
var $outsideHeaders = $("#header th"), 
    $tableHeaders = $(".dataTable th"); 

$outsideHeaders.on('click', function(){ 
    var i = $outsideHeaders.index(this); 
    $tableHeaders.eq(i).trigger('click'); 
}); 
+0

это не работает. все еще не вызвано –

+0

@SomeswaraSiripuram Вам нужно связать обработчики кликов '$ tableHeaders.click (function() {console.log ('clicked')})' – undefined

+0

Уже есть действие, определенное в событии click заголовка таблицы. И я проверил что он работает с помощью hardcoding индекса и вызывающего триггера. –

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