【问题标题】:How to retrieve data with jquery from dynamically created html objects如何使用 jquery 从动态创建的 html 对象中检索数据
【发布时间】:2013-08-20 00:59:41
【问题描述】:

我有一个网络项目,我将一些带有创建的 html 代码的问题注入到 html 页面中。由于这些 html 对象是动态创建的,我不知道会有多少问题以及它们的 ID。我需要得到选定的答案。

这里有一段动态创建的html代码和一些带有JSFiddle演示的javascript函数。我尝试获取所选答案的 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

如何获得选定的答案?任何帮助将不胜感激。

【问题讨论】:

    标签: jquery html jquery-mobile dynamic web


    【解决方案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/

    希望对你有帮助。

    【讨论】:

    • 是的,这正是我所需要的。非常感谢。
    • JSFiddle Demo 在这个例子中我扩展了类型。但我未能检索到用户选择的滑块值。你能检查一下代码吗?
    • JSFiddle 感谢您的帮助。通过小扩展,我可以获得数据。
    【解决方案2】:

    我已将@maverickosama92 解决方案更新为更简单的方法,看看这是否是您所需要的。

    在这里工作http://jsfiddle.net/REthD/7/

    更简单的方法:

    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;
    }
    

    【讨论】:

    • 是的,这是一个更简单的解决方案。感谢您的回答。但也会有文本或滑块输入,在这些情况下,我认为最好像 @maverickosama92 那样分别获得每个问题的答案。
    【解决方案3】:

    由于您没有使用 jquery 创建单击事件,因此您的 $(this) 没有获取按钮元素,而是获取了窗口对象。然后将窗口对象传递给 jquery。

    this 在从 onclick 调用时在函数中的值 event 将是对全局(窗口)对象的引用。 (see link)

    您可以通过使用 jquery 添加点击事件并从 html 中删除 onclick="nextPage()" 来解决此问题。与此类似的东西(当然,您应该只将其应用于“下一步按钮”):

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

    或者您可以继续在 html 中使用您的 onclick="nextPage()" 并且您可以像这样获得点击按钮:

    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 上是否是绑定点击事件的最佳方式,但我想使用 jquery 绑定点击事件会更好。

    JSFiddle binding events with jquery

    【讨论】:

    • 对我来说问题是我在创建文档后插入这些问题并且在这种情况下绑定事件时遇到问题。由于这些按钮插入到进程中间,我无法触发 Next 按钮事件。为了解决这个问题,我创建了 NextPage 函数并调用了它。但我无法检查你的答案。单击下一步按钮时,JSfiddle 演示没有响应。
    • 对不起,我只在 chrome 上测试了我的答案。我已经更新了 JSFiddle,所以你可以检查一下。但是最好的方法是用jquery绑定它。因为我知道在html里面的函数中添加事件参数在一些Android原生浏览器中是行不通的,因为我之前尝试过。我猜你正在构建一个网络应用程序,对吧?检查我更新中的最后一个 JSFiddle。如果您正在制作一个网络应用程序,请记得绑定到 touchstart 和 touchend 事件。我希望这会有所帮助!
    • 是的,我正在尝试构建一个 Web 应用程序,然后将其变成一个带有 phonegap 的 ipad 本机应用程序。我是 javascript 的新手,所以目前通过反复试验来学习它。 @maverickosama92 解决方案实际上帮助了我很多,感谢您的警告。至少我知道在哪里检查它是否在某些设备中失败。
    • 有很多博客文章解释了如何制作更好的phonegap应用程序。有很多技巧可以完成一个良好且响应迅速的 phonegap 应用程序。祝你好运。 PS.:这是一篇有一些技巧的博文:link
    • 感谢@lucaskoala 的建议
    猜你喜欢
    • 2013-08-14
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2018-07-14
    • 2011-04-23
    • 2019-06-19
    相关资源
    最近更新 更多