动态添加<;img>;通过PHP循环标记,通过在每个循环上调用JavaScript函数

动态添加<;img>;通过PHP循环标记,通过在每个循环上调用JavaScript函数,javascript,php,loops,innerhtml,appendchild,Javascript,Php,Loops,Innerhtml,Appendchild,我有一个PHP函数,它在数据库中循环图像结果,用HTML格式化它们,然后将包含HTML布局的变量返回到my page.PHP。这一切都可以正常工作,但在循环中,我有一些脚本标记,可以调用script.js文件中的函数。它需要两个参数(url和count)。我试图将结果的url从数据库传递给函数,创建一个新的img元素,并将传递的url附加到新创建的img标记的src属性。 到目前为止,这似乎是可行的-当我将结果记录到console.log中时,我得到了 不过,我在把它们放回前端时遇到了麻烦 下面

我有一个PHP函数,它在数据库中循环图像结果,用HTML格式化它们,然后将包含HTML布局的变量返回到my page.PHP。这一切都可以正常工作,但在循环中,我有一些脚本标记,可以调用script.js文件中的函数。它需要两个参数(url和count)。我试图将结果的url从数据库传递给函数,创建一个新的
img
元素,并将传递的url附加到新创建的img标记的src属性。 到目前为止,这似乎是可行的-当我将结果记录到console.log中时,我得到了

不过,我在把它们放回前端时遇到了麻烦

下面的代码显示了php循环的部分,后面是它在每个循环上调用的Javascript函数

    public function getResultsHtml($page, $pageSize, $term) {
        $fromLimit = ($page - 1) * $pageSize;
        $query = $this->con->prepare("SELECT * FROM images 
            WHERE (title LIKE :term
            OR alt LIKE :term) AND broken=0
            ORDER BY clicks DESC
            LIMIT :fromLimit, :pageSize");

        $searchTerm = "%" . $term . "%";
        $query->bindParam(":term", $searchTerm);
        $query->bindParam(":fromLimit", $fromLimit, PDO::PARAM_INT);
        $query->bindParam(":pageSize", $pageSize, PDO::PARAM_INT);
        $query->execute();

        $resultsHtml = "<div class='image-results'>";

        $count = 0;
        while($row = $query->fetch(PDO::FETCH_ASSOC)) {
            $count++;
            $id = $row["id"];
            $imgUrl = $row["imgUrl"];
            $siteUrl = $row["siteUrl"];             
            $title = $row["title"];
            $alt = $row["alt"];

            if($title){
                $displayText = $title;
            } else if ($alt) {
                $displayText = $alt;
            } else {
                $displayText = $imgUrl;
            }

            $resultsHtml .= "<div class='grid-item image$count'>
                                <a href='$imgUrl'>
                                    <script>
                                        document.addEventListener('DOMContentLoaded', function() {
                                            loadImage(\"$imgUrl\", \"image$count\");
                                        });
                                    </script>
                                    <span class='details'>$displayText</span>
                                </a>

                            </div>";
            }
            $resultsHtml .= "</div>";
            return $resultsHtml;
        }
目前我在前端没有得到任何结果。在页面源代码中,我可以看到每个锚标记中都有脚本标记,它们显示了预先加载了参数(
loadImage)的函数(http://www.com,image22)
),但它实际上并没有从函数中得到返回

下面是jQuery的解决方案,但我真的不想使用jQuery

            function loadImage(src, className) {

                var image = $("<img>");

                image.on("load", function() {
                    $("." + className + " a").append(image);
                });

                image.on("error", function() {

                });

                image.attr("src", src);

            }
函数loadImage(src,类名){
变量图像=$(“
我知道用
.innerHTML
动态编写
标记会有一些问题,但我认为这不是问题所在,因为脚本标记是在调用函数之前编写的

我想我有一些错误的触发顺序,或者我缺少jQuery用.append函数自动处理的东西

我还尝试了
aTag.appendChild(image);
,但也没有结果

我已经使用jQuery几个月了,但我正在努力彻底学习Vanilla JS——我正在努力掌握jQuery函数实际上是如何工作的,而不仅仅是盲目地依赖它们


非常感谢您的帮助!

请注意
queryselectoral()
返回类似NodeList()的数组,因此它应该是这样的:

(如果只希望一个元素返回给用户
querySelector()
,则不需要循环)
函数loadImage(src,类名){
var image=document.createElement(“img”);
image.src=src;
image.onload=函数(){
var tags=document.queryselectoral(“.”+className+a”);
对于(var i=0;i

问题在于您使用的是
querySelectorAll
,它返回的是
节点列表而不是单个DOM节点。这意味着您必须迭代
节点列表
,并将图像附加到其中的所有节点。为此,您可以为要插入图像的每个位置创建新副本,或者se
cloneNode
多次

var each=函数(xs,func){
对于(变量i=0;i


在所有操作之前,您是否预先定义了类似于
$resultsHtml='';
的内容?我做了!
$resultsHtml='";
刚好在
$count=0;
上面。我有一个几乎重复的PHP文件,做同样的事情,但它只是从数据库读取文本并将其输出到DOM-我只是在这个问题上遇到了麻烦,因为循环中有
元素!啊,好吧。如果这是一个JS问题,我不是这个问题的人。有一个答案iven,试一试。我现在就看一看-无论如何谢谢你!为了你的兴趣,我还编辑并附加了整个函数!哈哈,没关系。反正谁需要名声…实际上,它返回一个类似数组的对象,而不是数组。好吧,将
querySelector all
更改为
querySelector
解决了这个问题,现在是func我的印象是querySelector只针对页面上的第一个
,我没有考虑到
类名给它一个唯一的标识符!谢谢你的回答!谢谢你的回答!这正是问题所在-我在过去的几个小时里因为我以为querySelector只是针对页面上的第一个
。。
            function loadImage(src, className) {

                var image = $("<img>");

                image.on("load", function() {
                    $("." + className + " a").append(image);
                });

                image.on("error", function() {

                });

                image.attr("src", src);

            }