1

使用 JQueryMobile 最终版本和 jquery.mobile.datebox.js 插件。在 pageshow 事件中,我动态添加了一系列字段,其中一些是使用 datebox 插件的日期/时间字段。除了在较小的设备和特别是 iPhone 上之外,一切都很好(当你让桌面浏览器特别窄时,它也会发生)。当您单击帮助器弹出的日期或时间图标时,我可以选择一个日期/时间并将其放入该字段,但该字段随后与 .

这是页面显示代码的示例。它调用 web 服务来获取定义应添加到表单的字段的 json 数据。字段可以是日期、单选或文本。除了在弹出窗口后重绘日期/时间字段外,一切正常:

$('#editthing').live('pageshow', function (e, info) {
    var listurl = "/editthingattribute";
    //Add a cache 'buster' parameter
    var date = new Date();
    listurl = listurl + '?p_uid=' + date.getTime();
    $.ajax({
        url: listurl + "&p_id=" + getUrlVar("p_id") + "&p_thingattribute=" + getUrlVar("p_thingattribute"),
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        success: function (data) {
            var form = $("#formcontent");
            form.html = "";
            //Add the fields defined in the results from the database call
            $.each(data.editthingfields, function (index, item) {
                //Set the global field type
                fieldType = item.fieldType;

                if (item.fieldtype == 'date') {
                    inputType = 'date';

                    //This messes up on narrow browsers
                    form.append('<div data-role="fieldcontain">' + '<label for="' + item.fieldname + '_date">' + item.fieldlabel + ' (Date)</label>' + '<input name="' + item.fieldname + '_date" id="' + item.fieldname + '_date" ' + 'type="date" data-role="datebox" data-options=\'{"mode": "calbox", "dateFormat":"dd/mm/YYYY"}\' ' + 'value="' + item.fieldvalue.substring(0, 10) + '" />' + '</div>' + '<div data-role="fieldcontain">' + '<label for="' + item.fieldname + '_time">' + item.fieldlabel + ' (Time)</label>' + '<input name="' + item.fieldname + '_time" id="' + item.fieldname + '_time" ' + 'type="date" data-role="datebox" data-options=\'{"mode": "timebox"}\' ' + 'value="' + item.fieldvalue.substring(11, 17) + '" />' + '</div>');
                } else if (item.fieldtype == 'radio') {
                    inputType = 'radio';
                    //Add a suitable set of radio buttons for the attribute being edited.
                    form.append('<div data-role="fieldcontain">' + '<fieldset data-role="controlgroup">' + '<legend>' + item.fieldlabel + '</legend>');
                    var optionsarray = item.fieldoptions.split(',');
                    for (var i = 0; i < optionsarray.length; i++) {
                        if (item.fieldvalue == optionsarray[i]) {
                            form.append('<input name="' + item.fieldname + '" id="' + optionsarray[i] + '" ' + 'type="' + item.fieldtype + '" value="' + optionsarray[i] + '" checked="checked" />');
                        } else {
                            form.append('<input name="' + item.fieldname + '" id="' + optionsarray[i] + '" ' + 'type="' + item.fieldtype + '" value="' + optionsarray[i] + '" />');
                        }
                        form.append('<label for="' + optionsarray[i] + '">' + optionsarray[i] + '</label>');
                    }
                    form.append('</fieldset>' + '</div>');
                } else {
                    inputType = 'text';
                    form.append('<div data-role="fieldcontain">' + '<label for="' + item.fieldname + '">' + item.fieldlabel + '</label>' + '<input name="' + item.fieldname + '" id="' + item.fieldname + '" ' + 'type="' + item.fieldtype + '" value="' + item.fieldvalue + '" />' + '</div>');
                }
            });
            var thinghdr = $("#thingheader");
            thinghdr.html = "";
            $(data.thingdetails).each(function (index) {
                thinghdr.append("<h3>" + this.thingoper + " " + this.thingnumber + " " + this.thingdesc + "</h3>");
            });

            $("#editthing").page("destroy").page();
        }
    });
});

我猜这个问题是由于动态添加的字段,但我不知道如何解决它。

在此先感谢迈克

4

1 回答 1

0

您可能已经超越了这一点,但我发现更新元素的 jQuery 移动方式是在它们上调用 create。也许它会帮助你拥有你感兴趣的行为page("destroy").page();

在我将动态元素附加到存在后,我在它上面调用 trigger("create") ,如下所示:

$(".selector").append(elementToAppend).trigger("create");

这是来自这里的 jQuery 移动文档页面。

增强新标记

页面插件调度一个 pageInit 事件,大多数小部件使用它来自动初始化自己。只要引用了小部件插件脚本,它就会自动增强它在页面上找到的小部件的任何实例。

但是,如果您在客户端生成新的标记或通过 Ajax 加载内容并将其注入页面,则可以触发 create 事件来处理新标记中包含的所有插件的自动初始化。这可以在任何元素(甚至是页面 div 本身)上触发,从而为您节省手动初始化每个插件(listview 按钮、选择等)的任务。

例如,如果通过 Ajax 加载了 HTML 标记块(例如登录表单),则触发 create 事件以自动将其包含的所有小部件(在本例中为输入和按钮)转换为增强版本。这种情况的代码是:

$( ...包含小部件的新标记... ).appendTo( ".ui-page" ).trigger( "create" );

于 2012-04-20T14:34:38.653 回答