【问题标题】:Executing script tags inside innerHTML to perform an Ajax call在 innerHTML 中执行脚本标记以执行 Ajax 调用
【发布时间】:2014-11-13 13:58:45
【问题描述】:

我有一个“查询构建器”页面 (querybuilder.php),它允许用户构建 SQL 查询然后执行它。所有这些都可以正常工作。

查询的参数被发布到另一个 PHP 页面 (queryresults.php),该页面运行存储的过程,然后循环遍历结果以创建插入到 querybuilder.php 的表。该循环在每一行都包含一个复选框,其值设置为每条输出记录的 ID。

Queryresults.php(innerHTML 页面)也有一些下拉菜单,允许用户对已“检查”的行执行某些操作。我在 Javascript 之外创建了一个循环,为每个连续的复选框执行一次。

据我了解 - 我不能在 innerHTML 页面中包含脚本标签,但我需要与仅在加载 innerHTML 时创建并分配值的复选框进行交互。

我查看了一些解决方法,包括以下内容:http://24ways.org/2005/have-your-dom-and-script-it-too,但似乎都不起作用。

$checkboxes = isset($_POST['checkbox']) ? $_POST['checkbox'] : array();
foreach($checkboxes as $value) {

echo "
<script>
$('#doAction').on('click', function() {
  var id = ".$value.";
  var u = document.getElementById('user').value;

  $.ajax({
    type: \"POST\",
    url: \"storedprocs.php\",
    data: { id: id, u: user }
    })
    .done(function(msg) {
       document.getElementById('done').innerHTML=msg;
    });
  });
</script>";
}

来自 innerHTML 页面的最终 HTML 如下所示:

echo "
<div class="row">
  <div class="col-md-6">
    <select id="user" class="input-sm">
    <option value="1">User 1</option>
    <option value="2">User 2</option>
    <option value="3">User 3</option>
    </select>
  </div>

  <div class="col-md-3">
  <button class="btn" id="doAction" data-stmt="false">Submit</button>
  </div>
</div>

<div class="row">
<div class="leTable">
<table class="table-hover table-responsive">
  <tr class="heading">';
echo $tableheaders;
echo '</tr>';

  foreach($result as $row) {
   echo '<tr>
    <td><input type="checkbox" name="chkbox" id="idChkBox"><a href="otherpage.php?id='.$row[0].'" value="'.$row[0].'">'.$row[0].'</a></td>';
    for ($x=1; $x<sizeof($row); $x++) {
     echo '<td>'.$row[$x].'</td>';
    }
 echo '</tr>';
 }
echo '</table>';
echo '</div></div>';

为了使问题更加复杂,第二个变量来自的 id=user 元素是由另一个完全独立的 innerHTML 设置的,所以我也不知道如何引用它。

真正令人头疼的问题,我在 Google 上进行了广泛的搜索,并通过 StackExchange 进行了搜索,但无济于事。任何帮助将不胜感激!

谢谢!

【问题讨论】:

  • 你能发布你期望完成的 html 的样子吗?您只需要 1 个 Javascript 块来处理所有元素的事件,而不是每个 1 个块。另外,不要忘记元素 ID 必须是唯一的。
  • jQuery 仅在页面运行时才知道页面中的元素,因此添加到 DOM 的新元素无法被 jQuery 识别。为了解决这个问题,使用event delegation,将新添加的项目中的事件冒泡直到 jQuery 在页面加载时运行时所在的 DOM 中的某个点。许多人使用document 作为捕捉冒泡事件的地方,但没有必要在 DOM 树上爬那么高。理想情况下you should delegate to the nearest parent that exists at the time of page load.
  • Archer - 我现在已经编辑以包含完成的 html。你的意思是我只需要一个 javascript 块?
  • Jay - 谢谢,正在阅读,看起来很有帮助!

标签: javascript php jquery ajax innerhtml


【解决方案1】:

我认为如果没有太多语法错误,您的代码可以工作。它是 document.getElementById,而不是 document.getElementbyId。除此之外,您还应该使用 ;

结束变量声明

这一切都取决于最终呈现的页面。我们不知道最终的 php 输出是什么。

我强烈建议您使用外部 JavaScript 文件。内联 JS 不好。

【讨论】:

  • 谢谢,document.getElementbyId 是帖子中的错字。我的实际代码具有正确的大小写 - 我无法复制粘贴。我现在用 ; 结束了变量声明。但我认为这不是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多