GVKun编程网logo

Javascript:如何遍历页面上的所有DOM元素?(js 遍历dom)

3

在这篇文章中,我们将为您详细介绍Javascript:如何遍历页面上的所有DOM元素?的内容,并且讨论关于js遍历dom的相关问题。此外,我们还会涉及一些关于Angular2Typescript:如何

在这篇文章中,我们将为您详细介绍Javascript:如何遍历页面上的所有DOM元素?的内容,并且讨论关于js 遍历dom的相关问题。此外,我们还会涉及一些关于Angular2 Typescript:如何操纵DOM元素?、ASP.NET:如何从javascript访问转发器生成的元素?、HTML / Javascript:遍历本地(服务器端)文件夹的所有元素、Javascript / DOM:如何删除DOM对象的所有事件?的知识,以帮助您更全面地了解这个主题。

本文目录一览:

Javascript:如何遍历页面上的所有DOM元素?(js 遍历dom)

Javascript:如何遍历页面上的所有DOM元素?(js 遍历dom)

我试图遍历页面上的所有元素,所以我想检查此页面上存在的每个元素是否有特殊类。

那么,我怎么说我要检查每个元素?

答案1

小编典典

您可以将传递给*getElementsByTagName()以便它将返回页面中的所有元素:

var all = document.getElementsByTagName("*");for (var i=0, max=all.length; i < max; i++) {     // Do something with the element here}

请注意querySelectorAll(),如果可用(可以使用IE9+,IE8中的CSS),可以使用来查找具有特定类的元素。

if (document.querySelectorAll)    var clsElements = document.querySelectorAll(".mySpeshalClass");else    // loop through all elements instead

对于现代浏览器来说,这无疑会加速事情的发展。


浏览器现在在NodeList上支持foreach。这意味着您可以直接循环元素,而不用编写自己的for循环。

document.querySelectorAll(''*'').forEach(function(node) {    // Do whatever you want with the node object.});

性能说明 -尽最大努力确定您要寻找的内容。通用选择器可以根据页面的复杂性返回很多节点。即使您确实需要浏览别人可能看到的''body *''所有head内容,这也意味着您可以用作选择器来剪切所有内容。

Angular2 Typescript:如何操纵DOM元素?

Angular2 Typescript:如何操纵DOM元素?

2017年更新:
ViewChild将是访问Dom元素的最佳方式.

2016年发布的问题:

我尝试了以下两种方法,只有方法2可行.但我不想在每个方法中重复代码:document.getElementById().我更喜欢方法1,但为什么方法1不起作用?

有没有更好的方法来操纵Angular2中的DOM?

.html文件:

<video id="movie" width="480px" autoplay>
    <source src="img/movie.mp4" type="video/mp4">
    Your browser does not support the video tag.
</video>

方法1:

...
class AppComponent {
    videoElement = document.getElementById("movie");

    playVideo() {
        this.videoElement.play();
    }
}

方法2:

...
class AppComponent {

    playVideo() {
        var videoElement = document.getElementById("movie");
        videoElement.play();
    }
}
<div #itemId>{{ (items()) }}</div>

您可以通过ViewChild访问Element:

import {ViewChild} from '@angular/core';

    @ViewChild('itemId') itemId; 

    ngAfterViewInit() {
      console.log(this.itemId.nativeElement.value);
    }

ASP.NET:如何从javascript访问转发器生成的元素?

ASP.NET:如何从javascript访问转发器生成的元素?

我有一系列使用asp:repeater生成的行: @H_301_2@<asp:repeater ID="itemsRepeater" OnItemDataBound="itemsRepeater_ItemDataBound" runat="Server"> <itemtemplate> <tr> <td> <asp:HyperLink ID="linkView" runat="server" Text="<%# GetItemText((Item)Container.DataItem) %>" NavigateUrl="<%# GetViewItemUrl((Item)Container.DataItem) %>" /> </td> <td> <asp:HyperLink ID="linkDelete" runat="server" Text="Delete" NavigateUrl="<%# GetDeleteUrl((ActionItem)Container.DataItem) %>" /> </td> </tr> </itemtemplate> </asp:repeater>

转发器创建一个HTML表,每行包含一个项目的链接和(基本上)一个“删除”链接.以上简化示例代码生成类似于以下内容的HTML:

@H_301_2@<TR> <TD> <A href="ViewItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}"> AllisonAngle_SoccerGirl001.jpg </A> </TD> <TD> <A href="DeleteItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}">Delete</A> </TD> </TR>

现在一切正常,但我想将“删除”转换为客户端.我想能够点击链接,它将在客户端javascript:

>提示警告“你确定……”
>让javascript发出server-hit来实际删除他们想要的项目
>从客户端DOM树中删除该项

所以有四个问题需要解决:

>如何将javascript连接到客户端点击删除链接.
>如何知道用户点击了什么项目删除
>防止回发
>删除用户单击的行

这是我的问题.

从这里开始,你会发现我试图解决它.不要将以下任何内容与任何可能接受的解决方案相关联.仅仅因为我在下面发布了代码,并不意味着任何有用的代码.并不意味着我在最佳解决方案的吐痰距离内.而且因为我无法在工作之下做任何事情 – 它必定走错了路.

我的尝试

连接Javascript

第一个任务是将删除链接HTML从以下内容转换为:

@H_301_2@<A href="DeleteItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}"> Delete </A>

更多javascripty:

@H_301_2@<A href="#" onclick="DeleteItem('DeleteItem.aspx?ItemGuid={19a149db-5675-4eee-835d-3d78372ca6f9}')"> Delete </A>

并添加脚本:

@H_301_2@<script type="text/javascript"> //<![CDATA[ function DeleteItem(deleteUrl) { //Ask the user if they really want to if (!confirm("Are you sure you want to delete INSERT NAME HERE?")) { return false; } //Call returns false if the server returned anything other than OK if (!DoAjaxHit(deleteUrl) { return false; } //Remove the table row from the browser var tableRow = document.getElementById("Todo-WHAT ID"); if (row != null) { //Todo: how to delete the tableRow from the DOM tree? //document.Delete(tableRow) ? } //return false to prevent a postback return false; } //]]> </script>

可以使用什么组合的ASP代码来创建上述内容?我听说asp:LinkBut​​ton有一个OnClientClick事件,你可以在其中连接一个javascript函数:

@H_301_2@<asp:LinkButton ID="linkDelete" runat="server" Text="Delete" OnClientClick="DeleteItem(<%# GetDeleteUrl((ActionItem)Container.DataItem) %>);"/>

问题是呈现的HTML实际上包含:

@H_301_2@<a onclick="DeleteItem(&lt;%# GetDeleteUrl((ActionItem)Container.DataItem)) %>);" ...> Delete </a>

如果我将客户端点击事件处理程序更改为:

@H_301_2@OnClientClick="DeleteItem('todo - figure this out');"/>

它的工作原理 – 以及“todo – 想出这个”都可以.

防止回发

实际上发生了javascript调用上面的惨淡(我可以看到我的警报),但是还有下一个问题:从javascript函数返回false并不会阻止回发.事实上,我可以看到生成的HTML代码上的href不是“#”,而是

@H_301_2@javascript:__doPostBack('ctl0....

我尝试更改ASPX代码以自己包含OnClick处理程序:

@H_301_2@OnClick="#" OnClientClick="DeleteItem('todo - figure this out');"

但是编译器认为英镑是一个pragma,并且抱怨:

Preprocessor directives must appear as
the first non-whitespace character on
a line

表行标识

表行没有ID,它们由asp:repeater生成.

javascript函数如何知道触发click事件的内容? javascript需要能够找到该元素,并将其从树中删除.

注意:我当然更喜欢淡入淡出动画.

通常你会使用一个元素

@H_301_2@var tr = document.getElementById("the table row's id");

但表行没有容易知道的ID.由于存在多行,因此服务器在构建表时会生成ID.我意识到一些解决方案将不得不涉及改变:

@H_301_2@<TR>

@H_301_2@<TR runat="server">

这样每个表行都会有服务器生成的标识,但是如何从javsscript引用生成的名称?

通常我会认为脚本问题可以通过使用多个参数来解决:

@H_301_2@function DeleteItem(tableRowElement,deleteUrl) { //Do a web-hit of deleteUrl to delete the item //remove tableRowElement DOM object from the document tree }

但问题只是推到别处:你如何填充tableRowElement和deleteUrl来调用javascript函数?

这样一个简单的问题:将点击从回发转换为客户端.

所涉问题的数量越来越愚蠢.这似乎也表明了这一点

>理念解决方案完全不同
>没有解决方案

参考

Stackoverflow: How do I fade a row out before postback?

Stackoverflow: Javascript before asp:ButtonField click

asp.net: Accessing repeater elements from javascript.

Stackoverflow: How to access repeater generated elements?

解决方法

jQuery可以为您挖出标签: @H_301_2@$("[id$=linkDelete]").click(function() { DeleteItem(this.href); });

该代码说“找到ID以’linkDelete’结尾的所有DOM元素,并连接以下click事件处理程序”.

HTML / Javascript:遍历本地(服务器端)文件夹的所有元素

HTML / Javascript:遍历本地(服务器端)文件夹的所有元素

基本上,我有一个非常简单的网站,其根目录如下所示:

/images/
index.html
stuff.js

我想通过某种方式递归遍历/ images /目录中的每个文件,并按照我网站的一部分顺序显示它们.例如,如果/ images /包含:

images/a/a.png
images/b.png
images/c.jpg
....

然后index.html中的某个地方将包含:

<img src="images/a/a.png" />
<img src="images/b.png" />
<img src="images/c.jpg" />
....

我的第一个想法是使用stuff.js中的document.write()函数执行此操作,但我找不到在Javascript中迭代本地文件目录的好方法.我看到了一些关于AJAX的内容,但所有这些示例都涉及编辑现有文件,我显然不想这样做.

我目前的解决方案只是手动创建一个包含/ images /中所有文件的字符串数组,但这样做让我觉得“必须有更好的方法!”

如果我不清楚,请告诉我.

谢谢!

解决方法

也许最好的方法是使用服务器端语言为您执行此操作,并使用异步Javascript请求来显示数据.

此示例使用PHP列出指定目录中的所有文件,使用xmlhttprequest加载此输出并将结果转换为图像标记:

getimages.PHP:

<?PHP

    //The directory (relative to this file) that holds the images
    $dir = "Images";


    //This array will hold all the image addresses
    $result = array();

    //Get all the files in the specified directory
    $files = scandir($dir);


    foreach($files as $file) {

        switch(ltrim(strstr($file,'.'),'.')) {

            //If the file is an image,add it to the array
            case "jpg": case "jpeg":case "png":case "gif":

                $result[] = $dir . "/" . $file;

        }
    }

    //Convert the array into JSON
    $resultJson = json_encode($result);

    //Output the JSON object
    //This is what the AJAX request will see
    echo($resultJson);

?>

index.html(与getimages.PHP相同的目录):

<!DOCTYPE html>
<html>
    <head>
        <title>Image List Thing</title>
    </head>
    <body>

        <div id="images"></div>
        <input type="button" onclick="callForImages()" value="Load" />

        <script>

            //The div element that will contain the images
            var imageContainer = document.getElementById("images");



            //Makes an asynch request,loading the getimages.PHP file
            function callForImages() {

                //Create the request object
                var httpReq = (window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");

                //When it loads,httpReq.onload = function() {

                    //Convert the result back into JSON
                    var result = JSON.parse(httpReq.responseText);

                    //Show the images
                    loadImages(result);
                }

                //Request the page
                try {
                    httpReq.open("GET","getimages.PHP",true);
                    httpReq.send(null);
                } catch(e) {
                    console.log(e);
                }

            }


            //Generates the images and sticks them in the container
            function loadImages(images) {

                //For each image,for(var i = 0; i < images.length; i++) {

                    //Make a new image element,setting the source to the source in the array
                    var newImage = document.createElement("img");
                    newImage.setAttribute("src",images[i]);

                    //Add it to the container
                    imageContainer.appendChild(newImage);

                }

            }

            </script>

    </body>
</html>

请注意,这只是一个例子.您可能希望确保AJAX调用成功,并且JSON转换在服务器代码和客户端上都有效.

Javascript / DOM:如何删除DOM对象的所有事件?

Javascript / DOM:如何删除DOM对象的所有事件?

只是一个问题:有什么方法可以完全删除对象(例如div)的所有事件?

编辑:我正在添加div.addEventListener(''click'',eventReturner(),false);一个事件。

function eventReturner() {    return function() {        dosomething();    };}

EDIT2:我找到了一种可行的方法,但无法用于我的情况:

var returnedFunction;function addit() {    var div = document.getElementById(''div'');    returnedFunction = eventReturner();    div.addEventListener(''click'',returnedFunction,false); //You HAVE to take here a var and not the direct call to eventReturner(), because the function address must be the same, and it would change, if the function was called again.}function removeit() {    var div = document.getElementById(''div'');    div.removeEventListener(''click'',returnedFunction,false);}

答案1

小编典典

我不确定 _删除 所有 事件_是什么意思。删除特定事件类型的所有处理程序还是删除一种类型的所有事件处理程序?

删除所有事件处理程序

如果要删除所有(任何类型的)事件处理程序,则可以克隆 该元素并将其替换为其克隆:

var clone = element.cloneNode(true);

注意: 这将保留属性和子项,但不会保留对DOM属性的任何更改。


删除特定类型的“匿名”事件处理程序

另一种方法是使用,removeEventListener()但我想您已经尝试过了,但是没有用。

addEventListener每次调用匿名函数都会创建一个新的侦听器。调用removeEventListener匿名函数 无效
。匿名函数每次被调用时都会创建一个唯一的对象,尽管它可以调用一个对象,但它并不是对现有对象的引用。以这种方式添加事件侦听器时,请确保仅添加一次,它是永久的(无法删除),直到添加到它的对象被销毁为止。

您实质上是将匿名函数传递给addEventListeneras eventReturner返回一个函数。

您可以通过两种方法解决此问题:

  1. 不要使用返回函数的函数。直接使用功能:
function handler() {dosomething();}div.addEventListener(''click'',handler,false);
  1. 为此创建一个包装,addEventListener该包装存储对返回的函数的引用,并创建一些奇怪的removeAllEvents函数:
var _eventHandlers = {}; // somewhere globalfunction addListener(node, event, handler, capture) {if(!(node in _eventHandlers)) {    // _eventHandlers stores references to nodes    _eventHandlers[node] = {};}if(!(event in _eventHandlers[node])) {    // each entry contains another entry for each event type    _eventHandlers[node][event] = [];}// capture reference_eventHandlers[node][event].push([handler, capture]);node.addEventListener(event, handler, capture);}function removeAllListeners(node, event) {if(node in _eventHandlers) {    var handlers = _eventHandlers[node];    if(event in handlers) {        var eventHandlers = handlers[event];        for(var i = eventHandlers.length; i--;) {            var handler = eventHandlers[i];            node.removeEventListener(event, handler[0], handler[1]);        }    }}}

然后,您可以将其用于:

    addListener(div, ''click'', eventReturner(), false)// and laterremoveAllListeners(div, ''click'')

注意: 如果您的代码运行了很长时间,并且正在创建和删除许多元素,那么在_eventHandlers销毁它们时必须确保删除其中包含的元素。

今天的关于Javascript:如何遍历页面上的所有DOM元素?js 遍历dom的分享已经结束,谢谢您的关注,如果想了解更多关于Angular2 Typescript:如何操纵DOM元素?、ASP.NET:如何从javascript访问转发器生成的元素?、HTML / Javascript:遍历本地(服务器端)文件夹的所有元素、Javascript / DOM:如何删除DOM对象的所有事件?的相关知识,请在本站进行查询。

本文标签: