【问题标题】:Dynamically generating form elements using jquery使用 jquery 动态生成表单元素
【发布时间】:2014-03-15 16:01:19
【问题描述】:

页面中有多个段落。每个段落后面必须跟一个带有两个按钮AddEdit 的div。单击Add 按钮应在其上方动态创建一个文本区域。

无效的相关参考:

演示



HTML 代码:

<div id="notes"></div>

在我的 JavaScipt 中:

<script>
// get notes in json format from php array
var notes = <?php echo json_encode($notes); ?>;

// call the scan function to iterate through the notes
scan(notes);

function scan(obj)
{
    jQuery.each(obj, function(key, val) {
    if (val instanceof Object) {
    for ( var v in val ) {
        if (val[v]['type'] == 'Topic') {
           $("#notes").append('<h2 class="topic">'+val[v]['content']+'</h2>');
        }
        if (val[v]['type'] == 'Subtopic') {
           $("#notes").append('<h4 class="subtopic">'+val[v]['content']+'</h4>');
        }
        if (val[v]['type'] == 'Concept') {
           $("#notes").append('<h5 class="concept">'+val[v]['content']+'</h5>');
        }
        if (val[v]['type'] == 'Paragraph') {
           $("#notes").append('<p>'+val[v]['content']+'</p>');

           // append input for all paragraphs
           $('#notes').append('<div class="paragraphs">');
           $('#notes').append('<div id="block">');
           $('#notes').append('<p class="edit"></p>');
           $('#notes').append('<p>');
           $('#notes').append('<div id="para">');
           $('#notes').append('<p><textarea cols="40" rows="2" id="textarea"></textarea></p>');
           $('#notes').append('<button id="add" class="add success tiny">Add</button>');
           $('#notes').append('&nbsp;');
           $('#notes').append('<button id="startEdit" class="canEdit tiny">Edit</button>');
           $('#notes').append('</div>');
           $('#notes').append('</p>');
           $('#notes').append('</div>');
           $('#notes').append('</div>');

        }
        scan(val[v]);
        }   
     }
  });
};

// Add paragraph button

i = 1;
$('#textarea'+i).hide();

text = $('#textarea'+i).text();
var data = '{"subject_id":'+$subject_id+',"teacher_id":'+$teacher_id+',"editedContent":"'+text+'"}';

$('.paragraphs').on('click', '#add'+i, function() {
  if ( $('#add'+i).text() == "Add" ) {

    ajaxRequest(data, 'editNotes', 'POST');  // POST request on editNotes

    $('#textarea'+i).show();
    $('#add'+i).text('Save');
    $('#textarea'+i).focus(function() {
        this.select();
    });
  }
  else if ( $('#add'+i).text() == "Save" ) {

    ajaxRequest(data, 'saveNotes', 'POST');  // POST request on saveNotes

    if ($('#textarea'+i).val() == ''){
      alert('Enter something...');
    } else {
      $('#add'+i).text("Add");
      $('#textarea'+i).hide();
      var overview = $('#textarea'+i).val();
      i++;
      console.log('after: i='+i);
      $('.paragraphs').append('<div id="block'+i+'"><p class="edit'+i+'">'+overview+'</p><div id="para'+i+'"><p><textarea cols="40" rows="2" id="textarea'+i+'"></textarea></p><button id="add'+i+'" class="add'+i+' success tiny">Add</button><button id="startEdit'+i+'" class="canEdit'+i+' tiny">Edit</button></div></div>');
    }
  }

});
</script>

如何使用递增的 id 和类名动态添加表单元素?

感谢任何帮助

【问题讨论】:

  • 通常一个问题涉及使用?问号)。你的问题是什么?
  • 这不是 DOM 的工作方式。您不能分别插入开始和结束标签。
  • 我建议避免这样做..在 html 中这样做有什么问题>
  • 感谢@roko 指出这一点。我已经编辑了我的问题。

标签: javascript jquery json


【解决方案1】:

不幸的是,当您提交类似以下内容时,附加功能并不像看起来那样:

$('#element').append('<div>start here'):
$('#element').append('end here</div>'):

发送的第一个调用将关闭 div,它实际上会创建 2 个单独的元素。解决这个问题的一种方法是创建一个变量并将所有元素放入该变量并附加它,而不是使用大的追加,因为它可能会有点混乱。

示例:

http://jsfiddle.net/h8V93/

var appends='<div class="paragraphs">'
            +'<div id="block">'
            +'<p class="edit"></p>'
            +'<p>'
            +'<div id="para">'
            +'<p><textarea cols="40" rows="2" id="textarea"></textarea></p>'
            +'<button id="add" class="add success tiny">Add</button>'
            +'&nbsp;'
            +'<button id="startEdit" class="canEdit tiny">Edit</button>'
            +'</div>'
            +'</p>'
            +'</div>'
            +'</div>';

            $('#notes').append(appends);

我希望这会有所帮助。

更新

编辑以供进一步阅读,实际执行此操作的最佳方法是创建一个 html 页面作为单独的文件并像这样包含它:::

$.get("<urlhere>", function (data) {
    //Append, After, Before, Prepend data or whatever you want to do with it.
});

这在您将 html 文件保存在自己的服务器上的 GM 或 TM 脚本中非常方便。

希望此更新对未来的读者有所帮助。

在最新版本的 TM (tampermonkey) 中,由于添加了跨域源策略,使用 GM_xmlhttpRequest -> http://wiki.greasespot.net/GM_xmlhttpRequest

【讨论】:

  • 随时乐意为您提供帮助。
  • 请参考我更新的问题。我添加了两个问题。
  • 啊,不用担心。这些问题与原始帖子完全无关,我相信这两个问题都应该有自己的单独主题,以便他们可以获得更多的机会来回答。开始一个新的,我相信有人会提供帮助。
  • 如何增加 id 和类名?我在扫描函数var counter=0; 之前添加了一个计数器,然后在追加之前将计数器增加了 1。但是当我在类和 ID +'&lt;p class="edit'+counter+'"&gt;&lt;/p&gt;' 中使用它时,它会返回 editNaN。这是为什么呢?
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 2016-01-20
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多