2013-08-17 5 views
-1

У меня есть веб-проект, в который я вставляю некоторый вопрос с созданным html-кодом на страницу html. Поскольку этот объект html создается динамически, я не знаю, сколько вопросов будет и каковы будут их идентификаторы. Мне нужно получить выбранные ответы.Как получить данные с jquery из динамически создаваемых объектов html

Здесь есть фрагмент кода html, созданный динамически, и некоторые функции javascript с демонстрацией JSFiddle. Функция nextPage, где я пытаюсь получить выбранные ответы, не работает.

function nextPage() { 
var results = new Array(); 
var contents = $(this).parents("div").parents("div").find("input"); 
contents.filter(":checked").each(function() { 
    var idx = $(this).index(); 
    results.push($(this).parent().children().get(idx + 1).innerHTML); 
    alert($(this).parent().children().get(idx + 1).innerHTML); 
}); 
contents.filter(":text").each(function() { 
    results.push($(this).val()); 
}); 

alert(results.join(";")); 
pageNumber += 1; 
window.location = '#question' + pageNumber; 
} 

JSFiddle Demo

Как я могу получить выбранные ответы? Любая помощь будет оценена.

ответ

1

попробовать следующее (это то, что вы ищете):

var pageNumber = 1, isLastPage = 2, results = []; 

function nextPage() { 

    var contents = $('#question' + pageNumber).find(".answers");  

    contents.filter(":checked").each(function() {   
    var text = $(this).next().find("span.ui-btn-text").text(); 
    if(text == undefined || text == ""){ 
     text = $(this).parent().next().text(); 
    } 
    results.push(text);  
    }); 

    pageNumber += 1; 

    if(pageNumber > isLastPage){ 
    alert("Test Finished, all answers are : " + results.join(";")); 
    return; 
    } 
    window.location = '#question' + pageNumber; 
} 

function prevPage() { 
    pageNumber -= 1; 
    window.location = '#question' + pageNumber; 
} 

рабочую скрипку здесь: http://jsfiddle.net/REthD/5/

я надеюсь, что это помогает.

+0

Да, это то, что мне было нужно. Большое спасибо. –

+0

[JSFiddle Demo] (http://jsfiddle.net/frozt/gyztc/1/) здесь, в этом примере, я расширил типы. Но мне не удалось получить значение ползунка, выбранное пользователем. Не могли бы вы проверить код? –

+0

@ user2599879: проверьте свою скрипку, вот ссылка http://jsfiddle.net/gyztc/2/ – maverickosama92

0

Я обновил решение @ maverickosama92 до более простого подхода, посмотри, действительно ли это то, что вам нужно.

Рабочая Fiddle Здесь http://jsfiddle.net/REthD/7/

Simpler подход:

var pageNumber = 1, isLastPage = 2, results = []; 

function Responses() 
{ 
    var jqResponses = $('body').find(":checked"); 
    var arrResponses = []; 
    jqResponses.each(function(){ 
     arrResponses.push($('label[for*="' + this.id + '"]').text()); 
    }) 

    alert('Responses: ' + arrResponses.join(";")) 
} 

function nextPage() { 

    pageNumber += 1; 

    if(pageNumber > isLastPage){ 
     Responses();  
     return; 
    } 
    window.location = '#question' + pageNumber; 
} 

function prevPage() { 
    pageNumber -= 1; 
    window.location = '#question' + pageNumber; 
} 
+0

Да, это более простое решение. Спасибо за ответ. Но также будут текстовые или слайдерные входы, и в этих случаях я думаю, что было бы лучше получить ответы на каждый вопрос отдельно, как это делал @ maverickosama92. –

0

Как вы вратаря создать событие щелчка с JQuery, ваш $ (это) не получает элемент кнопки, он получает объект окна , Затем вы передаете объект window в jquery.

Значение этого внутри функции, когда вызывается из OnClick случае будет ссылка на глобальный (окно) объекта. (see link)

Вы можете решить либо добавлять свои события с помощью щелчка JQuery и удалить OnClick = "СледующаяСтраница()" от HTML. Что-то похожее на это (конечно, что вы должны применять его только в «следующих кнопок»):

$('input[type=button]').bind('click',nextPage); 

Или вы можете продолжать использовать ваш OnClick = «СледующаяСтраница()» внутри HTML, и вы можете получить нажал кнопку, как это:

var $clickedButton = $(this.event.target); 

Так что ваша функция будет:

function nextPage() { 

    var results = new Array(); 
    var contents = $(this.event.target).parents("div").parents("div").find("input"); 
    contents.filter(":checked").each(function() { 
     var idx = $(this).index(); 
     results.push($(this).parent().children().get(idx + 1).innerHTML); 
     alert($(this).parent().children().get(idx + 1).innerHTML); 
    }); 
    contents.filter(":text").each(function() { 
     results.push($(this).val()); 
    }); 

    alert(results.join(";")); 
    pageNumber += 1; 
    window.location = '#question' + pageNumber; 
} 

NEW JSFiddle updated demo

Я не знаю много о jquery mobile. И я не знаю, является ли размещение событий на html лучшим способом связать событие click, но я думаю, что было бы лучше связать события click с помощью jquery.

JSFiddle binding events with jquery

+0

Проблема для меня заключалась в том, что я вставлял эти вопросы после создания документа и имел проблемы с привязкой событий в этом случае. Я не мог запустить событие «Следующая кнопка», поскольку эти кнопки вставлены в середине процесса. Чтобы решить эту проблему, я создал эту функцию NextPage и назвал ее. Но я не мог проверить ваш ответ. Демонстрация JSfiddle не отвечала при нажатии кнопки Next. –

+0

Извините, я только проверял свой ответ на хром. Я обновил JSFiddle, так что вы можете проверить его. Но лучший способ сделать это - связать его с jquery. Поскольку я знаю, что добавление параметра события в функцию внутри html не будет работать в некоторых родных браузерах Android, так как я уже пробовал. И я думаю, вы строите веб-приложение, верно? Проверьте последний JSFiddle в моем обновлении. И если вы создаете веб-приложение, не забудьте привязать его к touchstart и коснуться событий. Надеюсь, это поможет! – lao

+0

Да, я пытаюсь создать веб-приложение, а затем сделать его ipad родным приложением с телефонной связью. Я новичок в javascript, поэтому в настоящее время изучаю его методом проб и ошибок. Решение @ maverickosama92 очень помогло мне и поблагодарило вас за предупреждение. По крайней мере, я знаю, где проверить, не удается ли это на некоторых устройствах. –