js动态查询指定class名的所有元素,querySelectorAll()和querySelectorAll()的区别
Posted adrow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js动态查询指定class名的所有元素,querySelectorAll()和querySelectorAll()的区别相关的知识,希望对你有一定的参考价值。
"document.querySelectorAll()"
方法返回的是一个静态的 NodeList(节点列表),即它只能在页面刚加载时获取到一次,之后即使有新的元素符合选择器,它也不会再重新获取。如果你想动态地获取到新增的元素,可以使用 "document.getElementsByClassName()"
或 "document.getElementsByTagName()"
。这些方法返回的是一个 HTMLCollection(HTML 元素集合),它们是动态的,可以在任何时候获取到所有匹配的元素,包括新增的元素。
使用上需要注意两者的差别,例子:
// 获取所有class为"card"和"imageDiv"的元素,将他们的鼠标指针样式改成移动图标 var moveDivs = document.querySelectorAll(".card, .imageDiv"); function selectMode() moveDivs.forEach(function(moveDiv) // 修改鼠标指针样式为\'move\' moveDiv.style.cursor = "move"; );
上面是querySelectorAll()的示例,下面是getElementsByClassName()的示例。
var moveDivs = document.getElementsByClassName("card imageDiv"); function selectMode() for (var i = 0; i < moveDivs.length; i++) moveDivs[i].style.cursor = "move";
getElementsByClassName()不需要使用逗号分隔多个类名,而是将它们作为一个空格分隔的单一字符串传递给getElementsByClassName()方法。getElementsByClassName()不支持forEach(),如果想要在一个 HTMLCollection 中遍历元素,需要使用for循环,而不是forEach()。
具有动态查询和表名的 BULK COLLECT/FORALL 语句 - Oracle PL/SQL
【中文标题】具有动态查询和表名的 BULK COLLECT/FORALL 语句 - Oracle PL/SQL【英文标题】:BULK COLLECT/FORALL statements with dynamic query and table name- Oracle PL/SQL 【发布时间】:2017-05-12 14:53:21 【问题描述】:我需要帮助来优化此查询以使用批量收集和 forall 语句。我创建了备份表 (BCK_xxxx) 以复制原始表 (ORIG_xxx) 中的所有数据,但在将其转换为批量收集时遇到问题。我在 BULK collect 中看到的大多数示例包括已经使用 %rowtype 定义了表名和结构。但是,我有数百个表要备份,所以我需要我的查询特别是表名是动态的。这是我的原始查询,在没有批量收集的情况下一一插入/删除数据并且需要大量时间:
DECLARE
--select all table names from backup tables (ex: BCK_tablename)
CURSOR cur_temp_tbl IS
SELECT table_name
FROM all_tables
WHERE OWNER = 'BCKUP'
ORDER BY 1;
--select all table names from original tables (ex: ORIG_tablename)
CURSOR cur_original_tbl IS
SELECT table_name
FROM all_tables
WHERE OWNER = 'ORIG'
ORDER BY 1;
l_tbl_nm VARCHAR2(30 CHAR);
BEGIN
--first loop to delete all tables from backup
FOR a IN cur_temp_tbl LOOP
l_tbl_nm := a.table_name;
EXECUTE IMMEDIATE 'DELETE FROM '|| l_tbl_nm;
l_deleted_cnt := l_deleted_cnt +1;
END LOOP;
--second loop to insert data from original to backup
FOR b IN cur_original_tbl LOOP
l_tbl_nm := b.table_name;
CASE
WHEN INSTR(l_tbl_nm,'ORIG_') > 0 THEN
l_tbl_nm := REPLACE(l_tbl_nm,'ORIG_','BCK_');
ELSE
l_tbl_nm := 'BCK_' || l_tbl_nm;
END CASE;
EXECUTE IMMEDIATE 'INSERT INTO ' || l_tbl_nm || ' SELECT * FROM ' || b.table_name;
l_inserted_cnt := l_inserted_cnt +1;
END LOOP;
dbms_output.put_line('Deleted/truncated tables from backup :' ||l_deleted_cnt);
dbms_output.put_line('No of tables inserted with data from original to backup :' ||l_inserted_cnt);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
dbms_output.put_line(l_tbl_nm);
END;
我正在考虑在我的第二个循环之后添加以下代码,但我在如何声明“cur_tbl”游标和“l_tbl_data”TABLE 数据类型时遇到问题。我无法使用行类型,因为表名应该是动态的,并且会在我的第二个循环的每次迭代中发生变化,这将列出原始表中的所有表名:
TYPE CurTblTyp IS REF CURSOR;
cur_tbl CurTblTyp;
TYPE l_tbl_t IS TABLE OF tablename.%ROWTYPE;
l_tbl_data l_tbl_t ;
OPEN cur_tbl FOR 'SELECT * FROM :s ' USING b.table_name;
FETCH cur_tbl BULK COLLECT INTO l_tbl_data LIMIT 5000;
EXIT WHEN cur_tbl%NOTFOUND;
CLOSE cur_tbl;
FORALL i IN 1 .. l_tbl_data .count
EXECUTE IMMEDIATE 'insert into '||l_tbl_nm||' values (:1)' USING
l_tbl_data(i);
希望您能帮助我并建议我如何使这段代码更简单。非常感谢。
【问题讨论】:
【参考方案1】:您似乎想从现有备份表中删除所有行,然后将原始表中的全部内容重新复制到备份表中。如果这是正确的,使用DELETE
进行删除和插入的任何循环操作都会很慢。
首先,要删除数据,请使用TRUNCATE
。由于您要重新填充,请使用 REUSE STORAGE
选项。这是从表中删除所有行的最有效方法。
TRUNCATE TABLE <backup table> REUSE STORAGE;
其次,要重新填充,只需使用 INSERT
和 SELECT
。
INSERT INTO <backup table> SELECT * FROM <orig table>;
您可以在按表循环时在循环中使用这些。无需在表格行中游标,这样会更快。
如果你有一个新表,你可以用 CTAS 做类似的事情......
CREATE TABLE <backup table> AS SELECT * FROM <orig_table>;
【讨论】:
谢谢.. 我在创建备份表时已经使用了 ctas。我熟悉使用 truncate 但在这里使用它很犹豫,因为它是一个 ddl 语句(自动提交)。我还将创建一个与此类似的过程,但它会从原始表中删除数据并从备份表中插入记录。使用 truncate 在这里非常危险,除非我做一些检查/验证所有数据都复制到备份表。还有另一种使用删除的方法吗?或者有没有像截断这样的自动提交的批量删除? 你想使用 truncate 的原因是你不会用所有的删除来淹没重做日志。是的,您确实要小心,因为截断不会回滚。但这些本质上是你的选择,删除和截断。【参考方案2】:除了删除和截断选项之外,还有第三个选项:重命名/删除。您重命名旧备份表,重新创建新备份 (CTAS)。如果创建 - 插入成功,则删除重命名的表,如果新备份失败,则将先前的旧备份重命名为初始备份名称。您基本上用磁盘空间的临时使用来换取重做日志。
您不需要批量处理,CTAS 仍然比批量处理更快。
【讨论】:
【参考方案3】:您是否使用过强制删除? 它首先由 Oracle Master J.B.E 引入 它用于删除数据并忽略表可能具有的约束,并且比其他删除语句快得多。
FORCE DELETE FROM <table_name>;
【讨论】:
这看起来不像是有效的语法。你能提供任何有关这方面的文件吗?以上是关于js动态查询指定class名的所有元素,querySelectorAll()和querySelectorAll()的区别的主要内容,如果未能解决你的问题,请参考以下文章