通过 XML HttpRequest 加载时 OnClick() 函数不起作用

Posted

技术标签:

【中文标题】通过 XML HttpRequest 加载时 OnClick() 函数不起作用【英文标题】:OnClick() Functions not working when loaded through XML HttpRequest 【发布时间】:2019-12-06 05:22:42 【问题描述】:

我创建了一个重新加载 div 内容的 XML HttpRequest,方法是在其位置重绘 SVG 地图。在 SVG 地图中是缩放、平移和重置 javascript 函数的事件触发器。 map 和 javascript 函数都用 Java 写成字符串

加载的 JavaScript 还包含在悬停时工作的工具提示函数,因此错误显然与 onclick() 相关

XML HttpRequest:

var xhttp = new XMLHttpRequest();
                        xhttp.onreadystatechange = function() 
                            if (this.readyState == 4 && this.status == 200) 
                               //select div with id map, replace this with ADMapYear.html and map as drawn in Eclipse/Java
                               document.getElementById("map").innerHTML = xhttp.responseText;
                               eval(document.getElementById("scriptLoad").innerHTML);
                            
                        ;
                        xhttp.open("GET", "/ADMapYear.html/"+year_selected, true);
                        xhttp.send();


JavaScript:

"function reset() \n" + 
                        "               for(var i = 0; i < 6; i++) \n" + 
                        "                   transformMatrix[i] = origMatrix[i];\n" + 
                        "                              \n" + 
                        "               var newMatrix = \"matrix(\"+ transformMatrix.join(' ') + \")\";\n" + 
                        "               matrixGroup.setAttributeNS(null, \"transform\", newMatrix); \n" + 
                        "          \n" + 
                        "           ;"+

                        "function pan(dx, dy) "+
                            "transformMatrix[4] += dx;"+
                            "transformMatrix[5] += dy;"+

                            "var newMatrix = \"matrix(\"+ transformMatrix.join(' ') + \")\";"+
                            "matrixGroup.setAttributeNS(null, \"transform\", newMatrix);"+
                        ""+

                        "function zoom(scale) "+
                            "for(var i = 0; i < 4; i++) "+
                                "transformMatrix[i] *= scale;"+
                            ""+

                            "transformMatrix[4] += (1-scale) * centerX;"+
                            "transformMatrix[5] += (1-scale)* centerY;"+

                            "var newMatrix = \"matrix(\"+ transformMatrix.join(' ') + \")\";"+
                            "matrixGroup.setAttributeNS(null, \"transform\", newMatrix);"+ 
                        ""

SVG:

<path class=\"button\" onclick=\"pan(0,25)\" d=\"M25 5 l6 10 a20 35 0 0 0 -12 0z\" style= \"fill: black;\"/>\n" + 
                                "       <path class=\"button\" onclick=\"pan(25,0)\" d=\"M5 25 l10 -6 a35 20 0 0 0 0 12z\" style= \"fill: black;\" />\n" + 
                                "       <path class=\"button\" onclick=\"pan(0, -25)\" d=\"M25 45 l6 -10 a20, 35 0 0, 1 -12,0z\" style= \"fill: black;\"/>\n" + 
                                "       <path class=\"button\" onclick=\"pan(-25,0)\" d=\"M45 25 l-10 -6 a35 20 0 0 1 0 12z\" style= \"fill: black;\"/>\n" + 
                                "       \n" + 
                                "       <circle class=\"button\" cx=\"25\" cy=\"20.5\" r=\"3\" onclick=\"zoom(1.25)\" style= \"fill: black;\"/>\n" + 
                                "       <circle class=\"button\" cx=\"25\" cy=\"29.5\" r=\"3\" onclick=\"zoom(0.8)\" style= \"fill: black;\"/>\n" + 
                                "       \n" + 
                                "       <g>\n" + 
                                "           <rect class=\"button\" x=\"12\" y=\"50\" width =\"30\" height=\"15\" onclick=\"reset()\" fill=\"#464647\"/>\n" + 

没有错误消息出现,只是在点击时不会缩放、平移或重置

【问题讨论】:

【参考方案1】:

我认为不存在,因为该函数在绑定时不存在。我建议你在 XML HttpRequest 返回后绑定函数

编辑: 此外,您将响应放入一个元素中,然后评估另一个元素:

document.getElementById("map").innerHTML = xhttp.responseText;
eval(document.getElementById("scriptLoad").innerHTML);

应该变成:

document.getElementById("map").innerHTML = xhttp.responseText;
eval(document.getElementById("map").innerHTML);

另外,我建议您不要使用 eval,因为这会在您的代码中造成漏洞。为了避免 eval,您可以在 HttpResponse 中发送一个脚本文件并将其添加到您的代码中。

【讨论】:

感谢您的建议,不幸的是这没有奏效 只是为了确保我们发现了问题,请求后是否可以看到函数“缩放”和“平移”?我的意思是,如果你从控制台调用它们,它们可以工作吗? 我刚刚再次运行它,它指出缩放在控制台中未定义【参考方案2】:

从 OnClick 调用 HTTPRequst 时,我也遇到了问题。我通过将被点击的元素(一个按钮)放在标签内来解决它。

【讨论】:

以上是关于通过 XML HttpRequest 加载时 OnClick() 函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在自适应对话框 HttpRequest 中从 xml 转换为 json?

Parse Image + Parse httpRequest 替换——从 Parse Cloud Code 迁移到 Parse Server on Node (Heroku / AWS / DO)

c# WebBrower 与 HttpRequest配合 抓取数据

tomcat容器是如何创建servlet类实例

Ajax知识

处理图片标签导致的HTTPRequest过多