亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

使用 rails/jquery-ujs 來(lái)編寫(xiě)非侵入式的 js 模板代碼

Me_Kun / 1357人閱讀

摘要:確定要?jiǎng)h除嗎刪除演示不是說(shuō)它有多么復(fù)雜,而是我真真切切感受到了它的高效,非常舒服的抽象了模板嵌套中的一些常用的交互。刪除代碼演示例子中中是命名空間。刪除代碼演示綁定到做回調(diào)這個(gè)事件是如何觸發(fā)的呢實(shí)際是在發(fā)送里面使用來(lái)觸發(fā)。

sf 上前端大牛太多,本人前端菜鳥(niǎo),總結(jié)歸納,覺(jué)得內(nèi)容不錯(cuò)就總結(jié)分享之。

慣例安利一波我的后端 php 直播課。
很多工程師在工作1~3年的時(shí)候最容易遇到瓶頸,不知道自己應(yīng)該學(xué)習(xí)什么,面試總是吃閉門(mén)羹。那么 PHP 后面應(yīng)該怎么學(xué)呢?《PHP 進(jìn)階之路》

原文地址 https://mengkang.net/1145.html
項(xiàng)目地址 https://github.com/rails/jque...
在線 demo

演示 jquery-ujs https://mengkang.net/demo/rails/

原理解析 - 代理表單提交 https://mengkang.net/demo/rai...

原理解析 - 實(shí)現(xiàn) ajax 提交 https://mengkang.net/demo/rai...

擴(kuò)展開(kāi)發(fā) - 行內(nèi)回調(diào) https://mengkang.net/demo/rai...

項(xiàng)目中經(jīng)??吹筋愃朴谙旅孢@樣的 a 鏈接的請(qǐng)求,而點(diǎn)擊的時(shí)候,實(shí)際發(fā)送的是 ajax 請(qǐng)求,而沒(méi)有發(fā)生跳轉(zhuǎn)。

刪除
演示 https://mengkang.net/demo/rails/

不是說(shuō)它有多么復(fù)雜,而是我真真切切感受到了它的高效,非常舒服的抽象了模板嵌套中的一些常用的交互。避免了重復(fù)編寫(xiě)類似于下面這樣的代碼:

$("#del_btn").bind("click", function () {
  if (confirm("確定要?jiǎng)h除?")) {
    var method = "/comments/destroy/908/";
    Ajax.sendData({
      type: "POST",
      url: method,
      async: false,
      dataType: "json",
      data: {},
      success: function (data, status, xhr) {
        if (data.state == "success") {
          location.href = "/articles/";
        } else {
          alert(data.msg);
        }
      },
      error: function (xhr, type, error) {
        console.log(error.toString());
      }
    });
  }
});

我們有可以在rails/jquery-ujs基礎(chǔ)上做更多的交互擴(kuò)展,文章末尾我們將把callback寫(xiě)在行內(nèi)的方式來(lái)擴(kuò)展該工具。

原理分析 A 鏈接實(shí)現(xiàn)表單的提交

雖然點(diǎn)擊還是跳轉(zhuǎn),但是通過(guò)控制臺(tái)可以看到,該請(qǐng)求是 post 的方式,我們自定義的 rails 插件給代理了 click 為一個(gè) form 的 post 請(qǐng)求。




    
    Title
    
    


    刪除

代碼演示 https://mengkang.net/demo/rai...

例子中

$(document).on("click.rails", "a[data-remote]", function (e) {
  //...
});

click.railsrails是命名空間。方便解除該事件。

http://api.jquery.com/on/
One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin".

Any event names can be used for the events argument. jQuery will pass through the browser"s standard JavaScript event types, calling the handler function when the browser generates events due to user actions such as click. In addition, the .trigger() method can trigger both standard browser event names and custom event names to call attached handlers. Event names should only contain alphanumerics, underscore, and colon characters.

An event name can be qualified by event namespaces that simplify removing or triggering the event. For example, click.myPlugin.simple defines both the myPlugin and simple namespaces for this particular click event. A click event handler attached via that string could be removed with .off("click.myPlugin") or .off("click.simple") without disturbing other click handlers attached to the elements. Namespaces are similar to CSS classes in that they are not hierarchical; only one name needs to match. Namespaces beginning with an underscore are reserved for jQuery"s use.

實(shí)現(xiàn) A 鏈接的 ajax 請(qǐng)求

在上面代碼的基礎(chǔ)上我們把data-remote參數(shù)利用上,如果data-remote設(shè)置為true則表示使用 ajax 請(qǐng)求。




    
    Title
    
    


  刪除

代碼演示 https://mengkang.net/demo/rai...
綁定到 ajax:success 做回調(diào)
$document.on("ajax:success", ".js-comment-destroy", function() {
    return $(this).closest(".media").remove();
});

這個(gè)事件是如何觸發(fā)的呢?實(shí)際是在發(fā)送 ajax 里面使用trigger來(lái)觸發(fā)。

options = {
    success: function(data, status, xhr) {
        element.trigger("ajax:success", [data, status, xhr]);
    },
    complete: function(xhr, status) {
        element.trigger("ajax:complete", [xhr, status]);
    },
    error: function(xhr, status, error) {
        element.trigger("ajax:error", [xhr, status, error]);
    }
}

options.url = rails.href(element);
options.method = element.data("method");
options.data = element.data("params") || null;

$ajax.(options);
擴(kuò)展開(kāi)發(fā)

以自定義 callback 為例,我們直接把 callback 定義在 data-done屬性中。為了完全非侵入式的 JavaScript 服務(wù)端開(kāi)發(fā),才有了這個(gè)需求(反正作為一個(gè)服務(wù)端渲染的模板,不想又去專門(mén)弄前端項(xiàng)目,更愿意直接在模板里修改)

準(zhǔn)備知識(shí)之 trigger + on

我們知道在 jquery 的on方法中回調(diào)函數(shù)的參數(shù)是支持無(wú)限多參數(shù)的,第一個(gè)參數(shù)event事件本身,后面都是自定義的任意內(nèi)容

handler Type: Function( Event eventObject [, Anything extraParameter ] [, ... ] )
http://api.jquery.com/on/#on-... 中

配合trigger來(lái)使用,兩個(gè)參數(shù)演示

$( "div" ).on( "click", function( event, person ) {
  alert( "Hello, " + person.name );
});
$( "div" ).trigger( "click", { name: "Jim" } );

trigger傳遞數(shù)組

$( "div" ).on( "click", function( event, salutation, name ) {
  alert( salutation + ", " + name );
});
$( "div" ).trigger( "click", [ "Goodbye", "Jim" ] );

到這里我們就可以看到 jquery-ujs 在發(fā)送 ajax 的 options 里面設(shè)置了

options = {
    success: function(data, status, xhr) {
        element.trigger("ajax:success", [data, status, xhr]);
    },
    //...
}
//...
$ajax.(options);

那我們綁定到data-done上就是

$(document).on("ajax:success", "[data-done]", function(event, data, status, xhr) {
  //...
});
準(zhǔn)備知識(shí)之 new Function() + call
https://developer.mozilla.org...
https://developer.mozilla.org...
var obj = {
  person: "Douglas Crockford"
};

function funA() {
  console.log(this.person);
}

funA.call(obj);

function funB(arg1,arg2) {
  console.log(this.person,arg1,arg2);
}

funB.call(obj,1,2);

// new Function (arg1, arg2, ... argN, functionBody)
new Function("arg1","arg2","console.log(this.person,arg1,arg2)").call(obj,3,4);
實(shí)現(xiàn) data-done 回調(diào)
代碼演示:https://mengkang.net/demo/rai...



    
    Title
    
    





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

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

相關(guān)文章

  • Spring體系常用項(xiàng)目一覽

    摘要:的面向的異常遵從通用的異常層次結(jié)構(gòu)。比如以前常用的框架,現(xiàn)在常用的框架包含許多項(xiàng)目,下面挑一些最常用的出來(lái)總結(jié)一下。狀態(tài)是流程中事件發(fā)生的地點(diǎn),在流程中通過(guò)轉(zhuǎn)移的方式從一個(gè)狀態(tài)到另一個(gè)狀態(tài),流程的當(dāng)前狀況稱為流程數(shù)據(jù)。 如今做Java尤其是web幾乎是避免不了和Spring打交道了,但是Spring是這樣的大而全,新鮮名詞不斷產(chǎn)生,學(xué)起來(lái)給人一種凌亂的感覺(jué),我就在這里總結(jié)一下,理順頭緒...

    OnlyLing 評(píng)論0 收藏0
  • 類型系統(tǒng)-前端進(jìn)化的里程碑

    摘要:這些優(yōu)勢(shì),其實(shí)都是類型系統(tǒng)所帶來(lái)的強(qiáng)類型語(yǔ)言所具有的開(kāi)發(fā)優(yōu)勢(shì),無(wú)論是在開(kāi)發(fā)體驗(yàn)還是后期項(xiàng)目維護(hù)上,都要優(yōu)于目前的。 大半夜的JavaScript Weekly發(fā)來(lái)賀電:TypeScript 2.0 Final Released! 沒(méi)錯(cuò),繼Angular2發(fā)布之后,TypeScript今天也發(fā)布了2.0版本,這不禁讓我浮想一番。如果要說(shuō)TS和JS最明顯的差別,我想一定是Type Syst...

    wangzy2019 評(píng)論0 收藏0
  • Spring入門(mén)看這一篇就夠了

    摘要:甲乙交易活動(dòng)不需要雙方見(jiàn)面,避免了雙方的互不信任造成交易失敗的問(wèn)題。這就是的核心思想。統(tǒng)一配置,便于修改。帶參數(shù)的構(gòu)造函數(shù)創(chuàng)建對(duì)象首先,就要提供帶參數(shù)的構(gòu)造函數(shù)接下來(lái),關(guān)鍵是怎么配置文件了。 前言 前面已經(jīng)學(xué)習(xí)了Struts2和Hibernate框架了。接下來(lái)學(xué)習(xí)的是Spring框架...本博文主要是引入Spring框架... Spring介紹 Spring誕生: 創(chuàng)建Spring的...

    superw 評(píng)論0 收藏0
  • Java培訓(xùn)學(xué)習(xí)之Java開(kāi)源軟件的匯總

    摘要:開(kāi)源軟件的匯總開(kāi)源插件是一個(gè)類似于的插件,它可以幫助你在不退出的環(huán)境下瀏覽本地文件系統(tǒng)。事件模型支持基于的事件提交。開(kāi)源容器是一個(gè)非侵入式的對(duì)象反轉(zhuǎn)控制容器容器。開(kāi)源插件提供一個(gè)可針對(duì)文件語(yǔ)法進(jìn)行著色的編輯器。 Java開(kāi)源軟件的匯總:EcSplorer 【Java開(kāi)源 Eclipse插件】EcSplorer(Eclips...

    qiangdada 評(píng)論0 收藏0
  • 【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(二) --- 框架概覽,雙向數(shù)據(jù)綁定,MVC

    摘要:本書(shū)的這一部分將為隨后的章節(jié)打下基礎(chǔ),會(huì)涵蓋模板,模塊化,和依賴注入。本書(shū)的小例子中我們會(huì)使用未經(jīng)壓縮的,開(kāi)發(fā)友好的版本,在的上。作用域也可以針對(duì)特定的視圖來(lái)擴(kuò)展數(shù)據(jù)和特定的功能。 上一篇:【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(一) 下一篇:【譯】《精通使用AngularJS開(kāi)發(fā)Web App》(三) 原版書(shū)名:Mastering Web Application D...

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

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

0條評(píng)論

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