在 html 中引用动态创建的元素

referencing a dynamically created element in html

我有一个输入字段 (search_text),当用户输入超过 1 个字母时,它会显示数据库中的图像 (id="demo2")。

然后我有一个绘制函数 (draw()),它应该在单击图像时执行某些操作(在从数据库中显示后)。

问题是图像 (id="demo2") 在 Html DOM 中不存在,只有在用户输入超过 1 个字母后才会出现。

现在,我有:

function myFunction(){
  console.log('success');
  alert("I am an alert box!");
  console.log('success2');
 var x = document.getElementById("demo2");
 console.log(x);
 x.addEventListener("click", myFunct);
 console.log(x);
}

function myFunct(){
  currentImg=document.getElementById("demo2");
 draw();
}


function myFunction2(){
  //alert("I am an alert box!");
  var x = document.getElementById("search_text").value;
  if (x.length >2){myFunction();} 
  }

当我慢速输入搜索词时会起作用,然后会出现警告框,然后,当我单击图像时,draw() 功能会起作用。

当我取出 alert 时,它不起作用。不知何故,警报让用户等到图像 loaded/created。我如何在没有警报的情况下实现这一目标?

谢谢!

使用 setTimeout 使其成为 运行 在一个单独的线程中,这将是 alert 在其他情况下所做的:

function myFunction2(){
  setTimeout(function(){
       var x = document.getElementById("search_text").value;
       if (x.length >2){
           myFunction();
       } 
  },100)//keep minimal time.
}

建议:

Why don't you add element to DOM toggle the display of an element instead of creating it after typing 2 chars?

您可以使用 jQuery 函数 $.on() 将动作绑定到尚未创建的元素。您只需将它指定在代码为 运行 时存在的元素上,例如 body 元素。

请参阅下面的 fiddle。 HEY 按钮在 3 秒后才会出现,但是由于我们如上所述将点击事件绑定到它,所以我们不会有任何问题。

//This is how you bind to a dynamically created element
$('body').on('click', '.myclass', myFunction);

setTimeout(function() {
  var button = document.createElement('button');
  button.className = "myclass";
  button.appendChild(document.createTextNode("HEY"));

  $('#button-cell').append(button);
}, 3000);

function myFunction() {
  alert("It's working!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tr>
    <td id="button-cell"></td>
  </tr>
</table>

即使这可行,我还是建议您考虑直接添加元素,然后切换它们的可见性。