#javascript #jquery #function
#javascript #jquery #функция
Вопрос:
Я довольно новичок в javascript и jquery и столкнулся с проблемой, для которой еще не нашел решения. Я попытаюсь описать это довольно простым способом.
У меня есть страница, которая предлагает пользователю несколько вариантов (это игра, так что ..), например, атаковать или защищаться, какое оружие использовать. Затем он загружает два HTML-файла, каждый с кнопкой «зафиксировать». Кнопки фиксации привязаны к (отдельным) функциям, которые передают данные в ajax.
Проблема, с которой я сталкиваюсь, заключается в том, что я погружаюсь во вложенные функции. Имеет ли это смысл? Мой код выглядит примерно так:
код:
$(function() {
$('#choice1').click(function() {
//do some stuff
});
$('#choice2').click(function() {
//do some stuff
});
$('#choice3').click(function() {
//do some stuff, including creating the choices below, and their submit boxes
$('#subChoice1').click(function() {
//send data with ajax to a php document. get result
//create some text on my document to display results
//create an input button, along with an id="subButton1"
});
$('#subChoice2').click(function() {
//send data with ajax to a php document. get result
//create some text on my document to display results
//create an input button, along with id="subButton1"
//(yes, feed both back to same func)
});
}); // end choice3
$('#subButton1').click(function() {
//my buttons in the subChoices do not call this function(!!??)
});
});
редактировать: ссылка больше не работает, извините. И я создал здесь живой пример.
Спасибо за любые советы или указатели. Я почти уверен, что есть что-то простое, чего мне не хватает или о чем я не знаю, что выведет меня на правильный путь.
Комментарии:
1. почему у вас вложенная привязка к клику?
2. потому что я не знаю лучшего способа сделать это. Я учусь по ходу дела.
Ответ №1:
Вы всегда можете использовать обычные именованные функции вместо встроенных анонимных. Это может помочь, если гора функций становится слишком высокой.
Обновить:
Вот ваш рабочий пример 1:
$('#button1').click(function(){
$('#div1').append('<span id="span1"><br>Alright. Button 1 worked. Here's another button.</br></span>');
$('#div1').append('<input type="button" value = "Button 2" id="button2"/>')
$('#button2').click(function() {
$('#div1').append('<span id="span1"><br>Hey! Button 2 worked!. Let's keep going.</br></span>');
$('#div1').append('<input type="button" value = "Button 3" id="button3"/>')
$('#button3').click(function() {
$('#div1').append('<span id="span1"><br>Hey! Button 3 worked!. That's probably enough.</br></span>');
});
});
});
Я предлагаю обновить его следующим образом:
function button3_click() {
$('#div1').append('<span id="span1"><br>Hey! Button 3 worked!. That's probably enough.</br></span>');
}
function button2_click() {
$('#div1').append('<span id="span1"><br>Hey! Button 2 worked!. Let's keep going.</br></span>');
$('#div1').append('<input type="button" value = "Button 3" id="button3"/>');
$('#button3').click(button3_click);
}
function button1_click() {
$('#div1').append('<span id="span1"><br>Alright. Button 1 worked. Here's another button.</br></span>');
$('#div1').append('<input type="button" value = "Button 2" id="button2"/>')
$('#button2').click(button2_click);
}
$('#button1').click(button1_click);
Таким образом, структура логики остается прежней, но вы можете извлекать определения вложенных функций.
Комментарии:
1. Спасибо за ответ. Это кажется правильным решением, но я не уверен, как выполнить это в jquery. Ознакомьтесь с кодом здесь: dixieandtheninjas.net/hunter/dev/test.js (в случае 1 есть встроенные анонимные функции, которые работают просто отлично. Случай 2 похож, но функции не являются встроенными, и, следовательно, созданные кнопки не могут ссылаться на функции)
2. @Jeremy: Эти функции все еще являются встроенными. Смотрите мой пример, чтобы понять, что я имел в виду под именованными функциями.
Ответ №2:
Если вы постоянно повторно используете классы или идентификаторы для кнопок отправки, вы можете использовать live()
метод jQuery. Это позволило бы вам создавать привязки для $('#subChoice1')
и $('#subChoice2')
за пределами обработчика щелчков для родительского выбора, но при этом они все равно будут правильно привязаны при их создании.