【问题标题】:Dynamically target specific DIV´s with unique ID in Ajax在 Ajax 中动态定位具有唯一 ID 的特定 DIV
【发布时间】:2021-03-12 14:37:11
【问题描述】:

假设我在一个页面上有 100 多个表单(我知道它很多,但在这件事上是必要的)并且我有一个 Ajax 可以提交每个表单而不重新加载它所在的页面,并显示/隐藏关于成功和错误从 jQuery 回调的 DIV,我该怎么做:

1 : 在 jQuery 中定位特定的 DIV ID 2 : 确保它提交特定的表单并且只提交这个表单(不对其他表单的必填字段进行验证)

JS代码:

<script>
$("form").on("submit", function(e) {

  var dataString = $(this).serialize();
  let response_div = $("[id^='response_div_']")

  $.ajax({
    type: "POST",
    url: "update_userdata.asp",
    data: dataString,
    success: function() {
      response_div.html("<div id='message' style='background-color: #28a745;'></div>");
      $("#message")
        .html("<font style='color: white;'>Løn Information er nu opdateret <i class='fas fa-check-circle'></i></font>")
        .hide()
        .fadeIn(1500, function() {
          $("#message").append(
            ""
          );
        });
    }
  });

  e.preventDefault();
});
</script>

HTML:

<div id="response_div_initials_1">
</div>
<form name="Initials2"  id="Initials2" action="">
<input type="hidden" name="UserID" id="UserID" value="1">
<input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="InitialsColumn">
  <fieldset>
    <div class="input-box">
    <label for="Initials" id="Initials">Initials</label>
    <input type="text" name="Initials" id="Initials" minlength="3" maxlength="3" class="text-input" required/>
    </div>
    <button type="submit" form="Initials2" value="Submit">Send</button>
  </fieldset>
</form>


<div id="response_div_EconomyColumns_1">
</div>
<form name="EconomyColumns1" id="EconomyColumns1" action="">
<input type="hidden" name="UserID" id="UserID" value="1">
<input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="EconomyColumns">
<fieldset>
<div class="input-box">
  <label for="lonnr" id="lonnr_label">lonnr</label>
  <input type="text" name="lonnr" id="lonnr" minlength="3" class="text-input" required/>
</div>
<div class="input-box">
  <label for="debnr" id="debnr_label">debnr</label>
  <input type="text" name="debnr" id="debnr" class="text-input"/>
</div>
<div class="input-box">
  <label for="orgnr" id="orgnr_label">orgnr</label>
  <input type="text" name="orgnr" id="orgnr" class="text-input"/>
</div>
  <button type="submit" form="EconomyColumns1" value="Submit">Send</button>
</fieldset>
</form>

<div id="response_div_initials_2">
</div>
<form name="Initials2"  id="Initials2" action="">
<input type="hidden" name="UserID" id="UserID" value="1">
<input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="InitialsColumn">
  <fieldset>
    <div class="input-box">
    <label for="Initials" id="Initials">Initials</label>
    <input type="text" name="Initials" id="Initials" minlength="3" maxlength="3" class="text-input" required/>
    </div>
    <button type="submit" form="Initials2" value="Submit">Send</button>
  </fieldset>
</form>

<div id="response_div_EconomyColumns_2">
</div>
<form name="EconomyColumns1" id="EconomyColumns1" action="">
<input type="hidden" name="UserID" id="UserID" value="1">
<input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="EconomyColumns">
<fieldset>
<div class="input-box">
  <label for="lonnr" id="lonnr_label">lonnr</label>
  <input type="text" name="lonnr" id="lonnr" minlength="3" class="text-input" required/>
</div>
<div class="input-box">
  <label for="debnr" id="debnr_label">debnr</label>
  <input type="text" name="debnr" id="debnr" class="text-input"/>
</div>
<div class="input-box">
  <label for="orgnr" id="orgnr_label">orgnr</label>
  <input type="text" name="orgnr" id="orgnr" class="text-input"/>
</div>
  <button type="submit" form="EconomyColumns1" value="Submit">Send</button>
</fieldset>
</form>

我尝试了 $("[id^='response_div_']") 的不同变体,但我尝试过的任何尝试都没有成功。

【问题讨论】:

  • 回调 function(e) 中的 e 不应该持有对该特定表单的引用吗?
  • 天哪,多么愚蠢的错误,谢谢 Brickowski 先生,在我的示例中,两个首字母的表单名称具有相同的 id 和名称,EconomyColumns 也是如此。表单的问题当我给他们唯一的名字和 id 时,target offcause 就消失了。所以似乎只剩下针对 DIV 的问题了。 :-)
  • 想了解更多业务需求。表单和响应 div 是一对一映射,不与其他人共享?提交的表单,消息应该只显示在关联的响应 div 上?

标签: javascript jquery ajax


【解决方案1】:

如果您有 100 多个表单,我建议 event delegation 让一个事件侦听器监听多个表单。

如果那些response_div_ 只是用于将消息显示到特定表单,而不是用于存储数据,我建议您不要为它们设置唯一ID。相反,我将响应 div 移动到表单下并将其设置为 form_response 类,以便您知道要更新哪个 div。

我还将样式放入&lt;style&gt;,因此您无需在脚本中处理 css。

我通常不在字符串文字中写 html。要在响应消息后添加一个图标,您可以将其卸载到 CSS 中,这会使您的脚本更整洁。检查form_response::after 样式。 Font awesome has an article on that.

附言您需要修复提交按钮和表单名称。有EconomyColumns1Initials2两种形式。

$('html').on('submit', 'form', function(e) {
  e.preventDefault();

  var dataString = $(this).serialize();
  // obtain the submitting form with e.currentTarget
  // then search the tree down for div with class form_response
  let responseDiv = $(e.currentTarget).children('div.form_response');

  $.ajax({
    type: "POST",
    url: "https://6049aeb7fb5dcc001796a5ad.mockapi.io/foobar", // mock api for testing
    data: dataString,
    success: function() {

      $(responseDiv)
        .html("Løn Information er nu opdateret")
        .hide()
        .fadeIn(1500, function() {
          // what is this line for?
          $("#message").append("");
        })
        // wait 5 second
        .delay(5000)
        // fade out
        .fadeOut(1500);
    }
  });

});
.form_response {
  display: none;
  background-color: #28a745;
  color: white;
}

.form_response::after {
  font-family: "Font Awesome 5 Free";
  content: "\f058";
  font-weight: 900;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<form name="Initials2" id="Initials2" action="">
  <div class="form_response"></div>
  <input type="hidden" name="UserID" id="UserID" value="1"> <input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="InitialsColumn">
  <fieldset>
    <div class="input-box">
      <label for="Initials" id="Initials">Initials</label> <input type="text" name="Initials" id="Initials" minlength="3" maxlength="3" class="text-input" required />
    </div>
    <button type="submit" form="Initials2" value="Submit">Send</button>
  </fieldset>
</form>



<form name="EconomyColumns1" id="EconomyColumns1" action="">
  <div class="form_response"></div>
  <input type="hidden" name="UserID" id="UserID" value="1"> <input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="EconomyColumns">
  <fieldset>
    <div class="input-box">
      <label for="lonnr" id="lonnr_label">lonnr</label> <input type="text" name="lonnr" id="lonnr" minlength="3" class="text-input" required />
    </div>
    <div class="input-box">
      <label for="debnr" id="debnr_label">debnr</label> <input type="text" name="debnr" id="debnr" class="text-input" />
    </div>
    <div class="input-box">
      <label for="orgnr" id="orgnr_label">orgnr</label> <input type="text" name="orgnr" id="orgnr" class="text-input" />
    </div>
    <button type="submit" form="EconomyColumns1" value="Submit">Send</button>
  </fieldset>
</form>


<form name="Initials2" id="Initials2" action="">
  <div class="form_response"></div>
  <input type="hidden" name="UserID" id="UserID" value="1"> <input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="InitialsColumn">
  <fieldset>
    <div class="input-box">
      <label for="Initials" id="Initials">Initials</label> <input type="text" name="Initials" id="Initials" minlength="3" maxlength="3" class="text-input" required />
    </div>
    <button type="submit" form="Initials2" value="Submit">Send</button>
  </fieldset>
</form>


<form name="EconomyColumns1" id="EconomyColumns1" action="">
  <div class="form_response"></div>
  <input type="hidden" name="UserID" id="UserID" value="1"> <input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="EconomyColumns">
  <fieldset>
    <div class="input-box">
      <label for="lonnr" id="lonnr_label">lonnr</label> <input type="text" name="lonnr" id="lonnr" minlength="3" class="text-input" required />
    </div>
    <div class="input-box">
      <label for="debnr" id="debnr_label">debnr</label> <input type="text" name="debnr" id="debnr" class="text-input" />
    </div>
    <div class="input-box">
      <label for="orgnr" id="orgnr_label">orgnr</label> <input type="text" name="orgnr" id="orgnr" class="text-input" />
    </div>
    <button type="submit" form="EconomyColumns1" value="Submit">Send</button>
  </fieldset>
</form>

【讨论】:

  • 杰出的 Brickowski 先生,就是这样,这就是我正在寻找的解决方案,它完全可以正常工作,谢谢! :-) .. 我什至现在为 DIV 添加了一个 SetTimeout 以淡出 :) .. 我可以再问你一件事,即使我已将您的答案标记为已接受? .. 如果我想根据我提交的表单动态填充 html("") 文本,我该怎么做? :-)
  • 顺便说一句: 是来自 FontAwsome.com 的字体图标 ;-)
  • 您想在 responseDiv 中显示一个双引号字符吗?就像任何其他字符一样,但带有转义序列 \。 $('body').html("this is a double quote: \"")
  • @Stkol76 您可以使用delay() 后跟fadeOut() 来排队后续动画。它很方便,而不是您自己处理计时器。
  • 谢谢@Mr Brickowsky,他成功了 :-)
【解决方案2】:

这就是你想要的……?

HTML

<h2>Form 1</h2>
<form>
  <div class="message"></div>
  <input type="text" name="name-a">
  <button type="submit">Submit</button>
</form>

<h2>Form 2</h2>
<form>
  <div class="message"></div>
  <input type="text" name="name-b">
  <button type="submit">Submit</button>
</form>

然后是 jQuery

$('form').submit(function(e){
   
   e.preventDefault();
   
   let data = $(this).serialize();
   let msgBox = $(this).find('.message');
   
   $.ajax({
     type: 'POST',
     url: 'update_userdata.asp',
     data: dataString,
     success: function(){
       msgBox.html("Put your html message here that will display according to the submited form");
       // Once we have the message we show the message box
       msgBox.css('display', 'block');

     }
   });
   

});

还有一些 CSS

.message {
  border: 1px solid red;
  padding: 4px;
  text-align: center;
  width: 100px;
  margin: 4px;
  display: none;
}

工作演示https://jsfiddle.net/jozsefk/1yw7c9x3/ 请注意,这只是向您展示如何操作的示例,您必须根据您的代码进行调整。 如果基于提交的表单存在,这还将显示您的输入名称和值。

【讨论】:

  • 这几乎是的,除了我需要能够将 HTML 扔给它,而不是来自输入的数据,并且我需要从即数据内容和不是从名字..我只是玩了一点,并将.text更改为.html,但这并没有给我我需要的结果。
  • 正如我上面写的那样,这是一个示例,您的 ajax 请求结果将是一个 html,然后您添加 msgBox.html('

    Hello World!

    ');

    Hello World!

    是您的 ajax 的结果。从您的示例
    这是 msgBox.html() 内容,您也可以每页使用一个 ID,请参阅
  • 我已经编辑了 jQuery 部分以更好地理解我的意思。
  • 抱歉 josefk,我根本无法让它工作。过去 3 小时我尝试使用完整的 Ajax 脚本以及部分(msgBox 的 3 行)并放置在我的初始脚本中,尝试同时使用类和 ID 作为消息,但还有很多组合,但是无论我做什么,我都无法以任何方式显示 DIV,当我使用完整的 Ajax 代码时,它不会提交给数据库 - 最后可能是我无法让您的 Ajax 工作的部分原因,因为我根本没有获得“成功”。我将在新问题的代码中发布我现在拥有的内容。
【解决方案3】:

这是我上次尝试的代码:

<div class="message" style="background-color: #28a745;"></div>
</div>
<form name="Initials1"  id="Initials1" action="">
<input type="hidden" name="UserID" id="UserID" value="1">
<input type="hidden" name="ColumnToUpdate" id="ColumnToUpdate" value="InitialsColumn">
  <fieldset>
    <div class="input-box">
    <label for="Initials" id="Initials">Initials</label>
    <input type="text" name="Initials" id="Initials" minlength="3" maxlength="3" class="text-input" required/>
    </div>
    <button type="submit" form="Initials1" value="Submit">Send</button>
  </fieldset>
</form>


<script>
$('form').submit(function(e){
   
   e.preventDefault();
   
   let data = $(this).serialize();
   let msgBox = $(this).find('.message');
   
   $.ajax({
     type: 'POST',
     url: 'update_userdata.asp',
     data: dataString,
     success: function(){
       msgBox.html("<p>Hello World!</p>");
       // Once we have the message we show the message box
       msgBox.css('display', 'block');

     }
   });
});
</script>

来自您的消息 CSS 仍在文档中

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签