您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
xpath Function
- // ==UserScript==
- // @name Includes : XPath
- // @description xpath Function
- // @author You
- // @version 1.0
- // @language en
- // @include nowhere
- // @namespace https://greasyfork.org/users/1385333
- // ==/UserScript==
- /**************************************************************************
- Author 's NOTE
- Original http://lowreal.net/blog/2007/11/17/1
- ***************************************************************************
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- **************************************************************************/
- const XPath = Xpath = xpath = (...args) => {
- let [expression, context, type] = args; // Destructuring arguments
- if (typeof context === "function") {
- type = context;
- context = null;
- }
- if (!context) context = document.documentElement || document;
- const documentInstance = context.ownerDocument || context;
- const evaluator = documentInstance.createExpression(expression, (prefix) => {
- const ns = documentInstance.createNSResolver(context).lookupNamespaceURI(prefix);
- if (ns) return ns;
- switch (context.contentType) {
- case "text/xhtml":
- case "application/xhtml+xml":
- return "http://www.w3.org/1999/xhtml";
- default:
- return "";
- }
- });
- switch (type) {
- case String:
- return evaluator.evaluate(context, XPathResult.STRING_TYPE, null).stringValue;
- case Number:
- return evaluator.evaluate(context, XPathResult.NUMBER_TYPE, null).numberValue;
- case Boolean:
- return evaluator.evaluate(context, XPathResult.BOOLEAN_TYPE, null).booleanValue;
- case Array: {
- const result = evaluator.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- const resultArray = [];
- for (let i = 0; i < result.snapshotLength; i++) {
- resultArray.push(result.snapshotItem(i));
- }
- return resultArray;
- }
- case undefined: {
- const result = evaluator.evaluate(context, XPathResult.ANY_TYPE, null);
- switch (result.resultType) {
- case XPathResult.STRING_TYPE:
- return result.stringValue;
- case XPathResult.NUMBER_TYPE:
- return result.numberValue;
- case XPathResult.BOOLEAN_TYPE:
- return result.booleanValue;
- case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
- const nodes = [];
- let node;
- while ((node = result.iterateNext())) {
- nodes.push(node);
- }
- return nodes;
- }
- default:
- return null;
- }
- }
- default:
- throw new TypeError("xpath: specified type is not a valid type.");
- }
- };