jquery插件——檢測DOM元素是否在瀏覽器可視範圍之內

来源:http://www.cnblogs.com/iforever/archive/2016/03/25/5320851.html
-Advertisement-
Play Games

引言 web應用中有很多地方會用到打點,用來檢測用戶行為,今天就做了個打點相關的需求,為了統計一個廣告給用戶的展示次數,每次用戶請求完成並且渲染完成之後就算一次成功的展示,其實有時候這個廣告還沒有在用戶的可視範圍之內,用戶需要滑動滾動條才能看見,但已經算了一次成功展示了,顯然這裡不太合理,這裡做了個 ...


引言

web應用中有很多地方會用到打點,用來檢測用戶行為,今天就做了個打點相關的需求,為了統計一個廣告給用戶的展示次數,每次用戶請求完成並且渲染完成之後就算一次成功的展示,其實有時候這個廣告還沒有在用戶的可視範圍之內,用戶需要滑動滾動條才能看見,但已經算了一次成功展示了,顯然這裡不太合理,這裡做了個檢測元素是否在可視範圍之內的小插件。

驗證可行性

為了實現這個,我首先想到的就是碰撞檢測,把瀏覽的頁面的寬度作為水平坐標,頁面的高度作為垂直的坐標,頁面中的一個元素看做一個矩形物體a,固定在坐標系中,瀏覽器可視區域看做另一個矩形物體b,水平和垂直的滾動條滾動事件看作是矩形物體b在移動,當矩形物體a出現在可視區域的時候其實就可以抽象為矩形物體a矩形物體b發生了碰撞。

有了這個思路,剩下的就是獲取抽象矩形的坐標了,一對左上角和右下角的坐標確定唯一一個矩形,元素矩形的坐標可以這樣獲得:

var src_begin_left = $("#src").offset().left,
    src_begin_top = $("#src").offset().top,
    src_end_left = src_begin_left + $("#src").width(),
    src_end_top = src_begin_top + $("#src").height();

同樣窗體矩形的位置也可以這麼確定:

var win_begin_left = $(window).scrollLeft(),
    win_begin_top = $(window).scrollTop(),
    win_end_left = win_begin_left + $(window).width(),
    win_end_top = win_begin_top + $(window).height();

實現碰撞檢測,碰撞檢測這個思路之前有看過,所以這次一下子就想到這個了,但具體的實現忘了,自己寫了好久發現好麻煩,後來查了資料,想起來了,碰撞檢測中碰撞的情況有好多,未碰撞的情況就比較少了只有四種(固定一個矩形,另一個矩形在固定矩形的上下左右的時候、最靠近的邊緣未發生碰撞才未發生碰撞,所有的情況都可以歸類到這種情況的一種),排除了未碰撞的情況,剩下的就是碰撞。

代碼

(function($){
  $.extend({
    //矩形的碰撞檢測
    /**
     * x1,y1 第一個矩形的左上角
     * x2,y2 第一個矩形的右下角
     * x3,y3 第二個矩形的左上角
     * x4,y4 第二個矩形的右下角
     *
     * return Boolean true=>碰撞
     */
    isCollsion: function(x1, y1, x2, y2, x3, y3, x4, y4){
      if(
        (x1 > x3 && x1 > x4) ||
        (x3 > x1 && x3 > x2) ||
        (y1 > y3 && y1 > y4) ||
        (y3 > y1 && y3 > y2)
      ){
        return false;
      }else{
        return true;
      }
    }
  });

  /**
   * opt中包含了兩個參數,元素實際位置的偏移
   *
   * return Boolean 是否在可視範圍之內
   */
  $.fn.isVisable = function(opt){
    opt = $.extend({
      offsetTop: 0, //網頁中元素比實際位置在垂直方向的偏移
      offsetLeft: 0 //網頁中元素比實際位置在水平方向的偏移
    }, opt);
    var me = $(this),
        srcInfo = {
          begin_left: (me.offset().left + opt.offsetLeft),
          begin_top: (me.offset().top + opt.offsetTop)
        }
        srcInfo.end_left = (srcInfo.begin_left + me.width());
        srcInfo.end_top = (srcInfo.begin_top + me.height());

        winInfo = {
          begin_left: $(window).scrollLeft(),
          begin_top: $(window).scrollTop()
        }
        winInfo.end_left = (winInfo.begin_left + $(window).width());
        winInfo.end_top = (winInfo.begin_top + $(window).height());

    //檢測是否”碰撞“”
    return $.isCollsion(
      srcInfo.begin_left, srcInfo.begin_top, srcInfo.end_left, srcInfo.end_top,
      winInfo.begin_left, winInfo.begin_top, winInfo.end_left, winInfo.end_top
    );
  }
})($);

有了這個就可以測試下了,隨便選一個網站,就看百度首頁,用chrome打開,按下F12,運行上面代碼,然後隨便算一個元素進行測試。

jquery對IE支持的很好了


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個簡單例子: 2.2版本需要引用jquery,要習慣把js代碼寫到頁面底部,經測試,發現此代碼不支持IE10/11,以下提供相容IE的function,替換js部分即可 最後,需要註意的是不要在本地調度,你會發現不會生效,因為Flash的安全限制 擴展閱讀:http://www.365mini.c ...
  • 第9章,裝飾網站導航 限制訪問,處於隱私方面考慮,瀏覽器已經開始限制可以對偽類:visited應用哪些CSS屬性了。其中包括對已訪問過的鏈接定義color、background-color、border-color等樣式(除非已經為那些鏈接的正常狀態定義了顏、背景色和邊框色) 對於<a>標簽可以對所 ...
  • 1.在Html中引入相關的文件:引入風格文件(js/css/jq) 2.創建myFocus標準的Html的結構並填充內容 <div id="picBox"> <div class="pic"> <ul> <li></li> <li></li> </ul> </div> </div> 3.調用 myF ...
  • 在JS中有全局作用域和函數作用域,而在Nodejs中也自己的作用域,分為全局作用域(global)和模塊作用域。 js作用域: 以前學js的時候我們的全局對象是window,如: 我們定義的全局變數預設是給window添加一個屬性或者方法。 報錯,因為num是在函數中定義的,在函數外部是訪問不了函數 ...
  • 第二十二章 1、 安全的檢測是使用:Object.prototype.toString.call(value); eg: PS:JSON的: 2、 作用安全域的構造函數:(不然this會指向window) PS:使用作用安全域的構造函數,就會鎖定調用構造函數的環境,如果使用構造函數竊取模式的繼承而且 ...
  • 1 事件的三要素 事件源:有監聽的HTML標簽,能響應時間的HTML標簽,就是事件源。 事件名:用戶的特定行為,比如onclick(單擊) 事件的響應:就是一個個function 事件的響應,就是function,那麼編程就是編寫事件的響應。響應中,最重要的就是想清楚被操作的對象。 下麵給大家看一個 ...
  • JavaScript的 DOM操作,主要是對DOM這三個字母中D、O、M的操作。D代表的是document(文檔),即我們可以使用javascript對文檔進行操作,O代表的是object(對象),對象包括用戶自定義對象,內建對象和宿主對象,這裡不再贅述,M代表的是model(模型),今天我們主要講 ...
  • 1 <!doctype html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <title>Baymax</title> 7 8 <style> 9 body { 10 background: #595959; 11 } 12 13 #baymax ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...