成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

爬蟲(chóng)可視化點(diǎn)選配置工具之獲取鼠標(biāo)點(diǎn)選元素

leoperfect / 1218人閱讀

摘要:類(lèi)型指定可能被其他元素包含的后代元素。這樣頁(yè)面選擇函數(shù)就寫(xiě)完了,下面就是引用了,在中添加函數(shù)點(diǎn)擊以上就完成了頁(yè)面選擇功能

前言
前面兩章已經(jīng)介紹怎么開(kāi)發(fā)一個(gè)chrome插件和怎么使用vue搭建一個(gè)彈出框的chrome插件,這一章來(lái)實(shí)現(xiàn)頁(yè)面元素選擇的功能,效果如下圖,鼠標(biāo)放到元素上,元素會(huì)高亮:

主要實(shí)現(xiàn)思路,創(chuàng)建一個(gè)和頁(yè)面一樣寬高的蒙層,監(jiān)聽(tīng)蒙層的鼠標(biāo)移動(dòng)事件,再使用elementFromPoint函數(shù)來(lái)獲得當(dāng)前鼠標(biāo)所在位置的頁(yè)面元素,具體實(shí)現(xiàn)如下:
shelter.js這是主函數(shù)

import $ from "jquery";
import validateSelect from "./validateSelected";
import isContentElement from "./isContentElement";

//選擇遮罩
export default class {
    constructor() {
        this.shelter = $("
"); //選擇過(guò)程中的div this.shelter.attr("id", "__pAp_SpiderShelter"); this.block = $("
"); this.lastSelectEl = null; //當(dāng)前鼠標(biāo)移動(dòng)到元素 this.shelterInterval = null; $(document.body).append(this.shelter); $(document.body).append(this.block); } beginSelect(onDomClick, onContextMenu, callback) { let that = this; this.shelter.css("position", "absolute"); this.shelter.css("display", "block"); this.shelter.addClass("pAp_spider_Selecter_Block"); this.shelter.bind("click", onDomClick); this.shelter.show(); this.shelter.css("width", "100%"); this.shelter.css("height", $(document).height() + "px"); this.shelter.css("left", "0"); this.shelter.css("top", "0"); this.shelter.mousemove(this.onShelterMouseMove(callback)); //初始化遮罩 function initCover() { that.shelterInterval = setInterval(function() { //如果遮罩層的高度小于頁(yè)面高度,則將遮罩的高度設(shè)置成頁(yè)面高度 if ($(document).height() > that.shelter.height()) { that.hideCover(); that.showCover(); } }, 500); } //鼠標(biāo)移動(dòng)到遮罩層上的時(shí)候,重置遮罩層 this.shelter.mouseover(function() { if (that.shelterInterval) { clearInterval(that.shelterInterval); that.shelterInterval = null; } }).mouseout(initCover); this.block.css("position", "absolute"); this.block.css("display", "block"); this.block.show(); this.showShelter(); //顯示遮罩陰影 this.block.css("z-index", "19891009") this.shelter.css("z-index", "19891010"); //綁定右鍵事件 document.oncontextmenu = onContextMenu; //鼠標(biāo)滾動(dòng)事件,目的是防止頁(yè)面滾動(dòng) $(this.shelter).on("mousewheel", function(evt) { event.stopPropagation(); event.preventDefault(); var height = evt.originalEvent.wheelDelta; if (!that.lastSelectEl) return; var el = that.lastSelectEl.get(0); while (el) { if (el.scrollHeight > el.offsetHeight || el.tagName == "BODY") { var lastTop = el.scrollTop; el.scrollTop = el.scrollTop - height; if (lastTop !== el.scrollTop) { break; } } el = el.parentElement; } }); initCover(); }; endSelect(callback) { if (this.shelterInterval) { clearInterval(this.shelterInterval); this.shelterInterval = null; } this.shelter.unbind(); this.shelter.remove(); this.block.remove(); $(document).unbind(); document.oncontextmenu = function() {}; callback && callback(); }; showShelter() { this.block.css("box-shadow", "0 0 20px #d4930d"); }; hideShelter() { this.block.css("box-shadow", "none"); }; //鼠標(biāo)移動(dòng)時(shí)的操作 onShelterMouseMove(callback) { let that = this; var position = { x: 0, y: 0 }; return function(e) { event.stopPropagation(); if (Math.abs(position.x - e.pageX) > 10 || Math.abs(position.y - e.pageY) > 10) { //隱藏蒙層 that.hideCover(); //返回當(dāng)前鼠標(biāo)所在位置的最頂層元素,也就是鼠標(biāo)所在的頁(yè)面元素 var el = $(document.elementFromPoint(e.clientX, e.clientY)); //顯示蒙層 that.showCover(); //如果是彈出框或者是遮罩則返回 if (!isContentElement(el)) return; //如果元素中有我們生成的屬性,則取父元素 if (!validateSelect(el)) { el = el.parent(); } if (!that.lastSelectEl || that.lastSelectEl.get(0) != el.get(0)) { that.lastSelectEl = el; } position = { x: e.pageX, y: e.pageY }; that.setPosition(el, that.block); callback && callback(that.lastSelectEl); } } } setShelterPosition(el) { this.setPosition(el, this.shelter); } /** * 把選擇框設(shè)置當(dāng)當(dāng)前選擇元素的位置 * @param {Jquery Dom Element} el 選擇的元素 * @param {Jquery Dom Element} shelter 遮罩層 */ setPosition(el, shelter) { if ((el.width() == 0 || el.height() == 0) && el.get(0).tagName == "A" && el.children().length) { that.setPosition(el.children().eq(0), shelter); return; } var paddingObject = { left: parseInt(el.css("padding-left")), top: parseInt(el.css("padding-top")), right: parseInt(el.css("padding-right")), bottom: parseInt(el.css("padding-bottom")) }; var _width = 0, _height = 0; if (!isNaN(paddingObject.left)) { _width += paddingObject.left; } if (!isNaN(paddingObject.right)) { _width += paddingObject.right; } if (!isNaN(paddingObject.top)) { _height += paddingObject.top; } if (!isNaN(paddingObject.bottom)) { _height += paddingObject.bottom; } var top = parseInt(el.offset().top); var height = el.height() + _height; var availHeight = $(document).height() - top; height = height > availHeight ? availHeight : height; var obj = { "left": parseInt(el.offset().left) + "px", "top": top + "px", "width": el.width() + _width, "height": height }; shelter.css(obj); }; hideCover() { this.block.css("z-index", "-2") this.shelter.css("z-index", "-1"); this.shelter.css("display", "none"); this.block.css("display", "none"); }; showCover() { this.shelter.css("display", "block"); this.block.css("display", "block"); this.block.css("z-index", "19891009") this.shelter.css("z-index", "19891010"); var height = $(document).height(); this.shelter.css("width", "100%"); this.shelter.css("height", height + "px"); this.shelter.css("left", "0"); this.shelter.css("top", "0"); }; setBlockCss(key, value) { this.block.css(key, value); } setShelterCss(key, value) { this.shelter.css(key, value); } }

validateSelected.js確保所選擇的元素是頁(yè)面本身的元素

import $ from "jquery";

/**
 * 判斷是否有我們生成的元素,即被我們標(biāo)記為選中的元素
 * @param {*} element 
 */
export default function(element) {
    var el = $(element);

    if (el.attr("__pAp_select")) {
        return false;
    }

    if (el.hasClass("__pAp_selectrow")) {
        return false;
    }
    return true;
};

isContentElement.js這個(gè)函數(shù)的作用也是確保所選擇的的元素是頁(yè)面自有的元素

import $ from "jquery";

/*
    判斷是否內(nèi)容元素,也就是判斷是不是我們的彈出框或者是遮罩
*/
export default function(element) {
    var expectClasses = [".layuiex", ".layuiex-layer", ".layuiex-layer-shade", ".layuiex-layer-moves", ".pAp_spider_Selecter_Block"];
    for (var _i = 0; _i < expectClasses.length; _i++) {
        var els = $(expectClasses[_i]);
        for (var a = 0; a < els.length; a++) {
            //$.contains( container, contained )
            //檢測(cè)一個(gè)元素包含在另一個(gè)元素之內(nèi)
            //container    Element類(lèi)型 指定可能包含其他元素的祖輩容器元素。
            //contained    Element類(lèi)型 指定可能被其他元素包含的后代元素。
            if ($.contains(els.eq(a).get(0), element) || els.eq(a).get(0) == element) {
                return false;
            }
        }
    }
    return true;
};

這樣頁(yè)面選擇函數(shù)就寫(xiě)完了,下面就是引用了,在main.js中添加函數(shù)

import Vue from "vue";
import $ from "jquery";
import "./layer/layer.css";
import layer from "./layer/layer";
import shelter from "./js/selector/shelter";

Vue.config.productionTip = false;
let shelterUi = new shelter();

......

new Vue({
    el: "#__paApa_container",
    components: {},
    data() {
        return {
            selectedEl: null
        };
    },
    mounted() {
        let that = this;
        shelterUi.beginSelect(that.onDomClick, null,
            function(selectedEl) {
                that.selectedEl = selectedEl;
            });
    },
    methods: {
        onDomClick() {
            console.log("點(diǎn)擊");
        }
    }
});

以上就完成了頁(yè)面選擇功能

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98543.html

相關(guān)文章

  • 視化爬蟲(chóng)配置chrome插件開(kāi)發(fā)搭建vue開(kāi)發(fā)環(huán)境

    摘要:使用開(kāi)發(fā)插件的好處本次開(kāi)發(fā)的插件是抓取配置插件,有很多的表單以及彈出層,如果純使用的話(huà)會(huì)有很多動(dòng)態(tài)創(chuàng)建的操作。使用和的語(yǔ)法以及的加載器相配合,可以減少大量動(dòng)態(tài)創(chuàng)建的代碼。 使用vue開(kāi)發(fā)chrome插件的好處 本次開(kāi)發(fā)的插件是抓取配置插件,有很多的form表單以及彈出層,如果純使用js的話(huà)會(huì)有很多動(dòng)態(tài)創(chuàng)建dom的操作。使用vue和ES6的import語(yǔ)法以及webpack的html加載...

    impig33 評(píng)論0 收藏0
  • 爬蟲(chóng)視化點(diǎn)選配置工具chrome插件簡(jiǎn)介

    摘要:從右上角菜單更多工具擴(kuò)展程序可以進(jìn)入插件管理頁(yè)面,也可以直接在地址欄輸入訪問(wèn)。其中,個(gè)是必不可少的,和是推薦的。 什么是Chrome插件 Chrome插件是一個(gè)用Web技術(shù)開(kāi)發(fā)、用來(lái)增強(qiáng)瀏覽器功能的軟件,它其實(shí)就是一個(gè)由HTML、CSS、JS、圖片等資源組成的一個(gè).crx后綴的壓縮包. 開(kāi)發(fā)與調(diào)試 Chrome插件沒(méi)有嚴(yán)格的項(xiàng)目結(jié)構(gòu)要求,只要保證本目錄有一個(gè)manifest.json即...

    RiverLi 評(píng)論0 收藏0
  • 精讀《Tableau 入門(mén)》

    摘要:可以看到,遙遙領(lǐng)先的城市有三個(gè),加州是銷(xiāo)售之王。將再拖拽到,并右鍵將其粒度改為月。從上圖可以看到,指定了個(gè)分類(lèi),最右上角加州就是最突出的一組,整個(gè)聚類(lèi)只有它一個(gè)元素,而畫(huà)面偏左下角的也是一類(lèi),這些是業(yè)績(jī)較差的一組數(shù)據(jù)。 1. 引言 引用著名瑞典統(tǒng)計(jì)學(xué)家 Hans Rosling 的一句話(huà):想法來(lái)源于數(shù)字、信息,再到理解。 分析數(shù)據(jù)的最好方式是可視化,因?yàn)榭梢暬休d的信息密度更高,甚至可...

    svtter 評(píng)論0 收藏0
  • 新聞爬蟲(chóng)倒騰筆記

    摘要:新聞爬蟲(chóng)在列表頁(yè)獲取列表和時(shí)間材料,開(kāi)發(fā)人員工具,插件,,安裝包使用開(kāi)發(fā)人員工具分析網(wǎng)站右鍵或打開(kāi),刷新載入打開(kāi)頁(yè)簽,點(diǎn)選第二排的小漏斗,點(diǎn)入頁(yè)面,因?yàn)樾侣劧加斜粰z索到的需要,所以一般情況下都可以在第一個(gè)文檔中找到需要的信息。 新聞爬蟲(chóng)1.0 在列表頁(yè)獲取列表和時(shí)間 材料:Pycharm,Chrome開(kāi)發(fā)人員工具,infoLite插件,bs4,request 安裝包 pip insta...

    April 評(píng)論0 收藏0
  • 18 章 CSS 鏈接、光標(biāo)、 DHTML 、縮放

    摘要:宋體中鏈接的使用宋體中光標(biāo)的使用宋體中宋體的使用宋體中縮放的使用宋體中鏈接的使用超鏈接偽類(lèi)屬性宋體表示該超鏈接文字尚未被點(diǎn)選宋體表示該超鏈接文字已被點(diǎn)選過(guò)宋體表示該超鏈接文字正被點(diǎn)選宋體但未被放開(kāi)宋體表示當(dāng)鼠標(biāo)停留1.CSS 中鏈接的使用 2.CSS 中光標(biāo)的使用 3.CSS 中 DHTML 的使用 4.CSS 中縮放的使用 1 18 8. .1 1 S CSS ?中 鏈接的使用 超鏈接偽類(lèi)...

    tainzhi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<