本文目錄一覽:
怎麼把兩個JS事件綁定到一起
這很簡單啊,button裡面給一個click事件,click事件裡面寫一個js方法,調用超鏈接就好了。還可以設置css樣式什麼 的。如果想要更好點的效果,可以用jquery。
Vue.js入門教程(三)雙向綁定和數據渲染
既然清楚了原理,那麼,接下來進入正題——我知道了vue怎麼安裝,那麼我怎麼使用呢?
在告訴你基礎用法之前,我還是要先告訴你一個情況。
可能要令你有點失望。vue主要是側重於數據端的。他的目的就是渲染數據和在前端調整一下數據邏輯。
他不是像jquery那樣讓你用來做特技的。就算你要做特技。你也應該通過css3/canvas而不是dom。
所謂的雙向綁定,你可以理解就是把view。(你還不清楚mvc的話,請看第一章)
和model綁定到一起。說白了,就是你js中的綁定值變了。你dom中的內容就跟著一塊變了。
vue是通過解析{{文字..}}來生成內容的。後面綁定方法,輸出內容的時候都會講到。
列表輸出使用 v-for,這些v開頭加橫杠的叫做命令
這些命令是可以自定義的。但是那都屬於高級操作,我們不用它也完全足夠支撐做一個大型項目了。
其實你回發現,這裡無論是v-for或者是v-什麼其他玩意
它都深刻的遵循了es6的語法。這裡不就是一個典型的for in 循環嗎。不過我們現在都用for of了。
你記住這個用法,它就長這樣。
前後端分離開發的關鍵在於:後台只提供介面。
我們獲得的數據多數情況下,僅僅是一個json,而mvvm的關鍵就再於解析數據在前端完成了。如果你了解jsp或者php你會了解,數據的解析在mvc中,
是由後端完成的,而html只負責顯示。
所以,當你了解了數據綁定和渲染以後,你可以第一時間先把數據輸出到頁面了。
我們前端最厲害的地方不就是處理能看得見的東西嗎?
js 綁定方法怎麼寫?
方法一:綁定屬性元素
最簡單和向後兼容性最好的事件綁定方法是把事件綁定到元素標識的屬性。事件屬性名稱由事件類型外加一個「on」前綴構成。儘管HTML屬性並不是大小寫敏感的,人們還是定義了一個規則,規定事件類型的每一個「詞」的首字母大寫,比如onClick 和onMouseOver。這些屬性也被稱為事件處理器,因為它們指示了元素如何「處理」特定的事件類型。
示例:
INPUT TYPE=”button” NAME=”myButton” VALUE=”Click Here” onClick=”myFunc()”
!–把事件綁定到元素屬性上有一個優點,即可以支持開發者把參數傳遞給事件處理器函數。接收事件的元素的引用則由一個特殊的參數值–this
關鍵字來傳遞。下面的代碼演示一個函數如何藉助傳入參數,把任意數目的文本框的內容轉化為大寫: —
SCRIPT LANGUAGE=”JavaScript”function convertToUpper(textbox) {
textbox.value = textbox.value.toUpperCase();}
/SCRIPT…FORM ….
INPUT TYPE=”text” NAME=”first_name” onChange=”convertToUpper(this)”
INPUT TYPE=”text” NAME=”last_name” onChange=”convertToUpper(this)”…/FORM
方法二:綁定IE4+SCRIPT FOR標識
IE4+ 中,Microsoft 對 SCRIPT 標識實現了自己的擴展,可以將它包含的腳本語句和某個元素的一個事件類型進行綁定。支持這個綁定的標識屬性(還沒有被 W3C 批准為 HTML 的一部分)是 FOR 和EVENT。
FOR 屬性的值必須是您為元素的 ID 屬性分配的唯一標識符。然後,您必須把事件的名稱(onmouseover,onclick,等等)分配給 EVENT屬性。在上面的按鍵實例的基礎上,我們必須對按鍵標識進行修改,使之包含一個ID 屬性:
INPUT TYPE=”button” NAME=”myButton” ID=”button1″ VALUE=”Click Here”
!–腳本語句並不在函數中,而是在 SCRIPT 標識中,如下所示:–
SCRIPT FOR=”button1″ EVENT=”onclick”// script statements here /SCRIPT
方法三:綁定對象屬性
對於 NN3+ 和 IE4+ 這兩類瀏覽器,腳本編程人員可以以腳本語句的方式把事件綁定到對象上,而不是綁定到元素標識的屬性上。每一個負責事件響應的元素對象都為自己能夠識別的事件設置了相應的屬性。對象屬性名稱是元素標識屬性的小寫形式,比如onmouseover。NN4 還接受 interCap(即首字小寫,之後的每一個詞的首字大寫)版本的屬性名,但是考慮到跨瀏覽器的兼容性,所有字母都是小寫的名稱會更安全一些。
當您把一個函數的引用賦值給一個事件屬性的時候,就發生了綁定。函數的引用是指函數的名稱,但是不帶函數定義中的括弧。因此,如果要為一個名為myButton 的按鍵的點擊事件(click)進行綁定,使之激活一個定義為myFunc() 的函數,則其賦值語句如下所示:
document.forms[0].myButton.onclick = myFunc;
方法四:使用IE5/Windows的attachEvent()方法
attachEvent() 方法的用法如下所示:
elemObject.attachEvent(“eventName”, functionReference);
eventName 參數的值是表示事件名稱的字元串,比如 onmousedown。 functionReference 參數是一個不帶括弧的函數引用,和早些時候描述的事件屬性方法中一樣。因此對於上面例子的按鍵對象,可以通過如下的腳本語句把函數綁定到按鍵的 click 事件:
document.getElementById(“button1”).attachEvent(“onclick”, myFunc);
由於 attachEvent() 方法必須嚴格工作在 IE5+/Windows 的環境中,所以您既可以使用 W3C DOM 的元素引用方式(如上文所示),也可以使用 IE4+ 的引用方式:
document.all.button1.attachEvent(“onclick”, myFunc);
方法五:使用W3C DOM的addEventListener();
addEventListener() 方法的語法如下所示:
nodeReference.addEventListener(“eventType”, listenerReference, captureFlag);
用 W3C DOM 規範中的行話來說,addEventListener() 方法為指定的結點註冊了一個事件,表示該結點希望處理相應的事件。
這個方法的第一個參數是一個聲明事件類型的字元串(不帶”on”前綴),比如click,mousedown,和keypress。
addEventListener() 方法的第二個參數可以和早些時候描述過的函數引用同樣對待。
第三個參數則是一個 Boolean 值,指明該結點是否以DOM中所謂的捕捉模式來偵聽事件。事件的捕捉和派發—綜合起來稱為事件的傳播–最後由另一篇文章來描述。對於一個典型的事件偵聽器來說,第三個參數應該為false(假)。
如何將c++綁定至javascript
下載綁定生成器,本機路徑/Users/iven/Dev/bindings-generator
為了在Mac OS X中安裝運行MacPort埠,系統必須要已經安裝蘋果的「Command Line Developer Tools」(命令行開發者工具)。Xcode 4及以後版本的用戶首先需要通過啟動或運行Xcode接受Xcode EULA。
xcodebuild -license
下載安裝MacPort
注意:如果是Homebrew用戶,應該先卸載Homebrew。因為Homebrew不兼容MacPort。
同時執行MacPort的「selfupdate」命令以確保安裝最新的發布版本。
sudo port -v selfupdate
當更新完成之後,使用MacPort在命令行中安裝python依賴(dependencies)
sudo port install python27 py27-yaml py27-cheetah
你會看到如下所示:
下載llvm-3.3,解壓至$HOME/bin目錄。如果沒有bin目錄,請創建一個bin目錄,將未解壓的ZIP壓縮包重命名為「clang+llvm-3.3」。
最後目錄如下所示:/Users/guanghui/bin/clang+llvm-3.3(guanhui是本機的主目錄名字)
樣本代碼
綁定生成器資源庫中包括一個樣本測試用例。打開bindings-generator/test/simple_test文件夾。
配置
根據自己的環境個性化設置「test/userconf.ini」和「test/user.cfg」文件。
注意:應該移除後綴為「.sample」的文件如「user.cfg.sample」和「userconf.ini.sample」
[DEFAULT]
androidndkdir=/Users/iven/Dev/android-ndk-r8c
clangllvmdir=/Users/iven/Dev/clang+llvm-3.1-x86_64-apple-darwin11
cxxgeneratordir=/Users/iven/Dev/bindings-generator-master
user.cfg配置如下所示
PYTHON_BIN=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/ python2.7
運行測試樣本
./test.sh
如果環境設置正確,你會看到如下所示:
Errors in parsing headers:
1. severity = Warning,
location =SourceLocation file None, line 0, column 0,
details = “argument unusedduring compilation: ‘-nostdinc++'”
不用擔心這個警告,你已完成運行,測試用例會創建一個包含3個文件的「simple_test_bindings」目錄。
一個綁定類的.hpp頭文件
一個實現綁定類的.cpp文件
一個介紹如何(從Java腳本)調用C++類暴露方法的.js文件。
運行測試
Create a JS base Cocos2d-x project. 創建基於JS的Cocos2d-x項目
將「simple_Test folder」文件夾和「simple_test_binding」文件夾添加到項目中
修改「autogentestbindings.cpp」中的註冊函數如下:
void register_all_autogentestbindings(JSContext* cx, JSObject* obj) {
jsval nsval;
JSObject *ns;
JS_GetProperty(cx, obj, “ts”,nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, “ts”,nsval);
} else {
JS_ValueToObject(cx,nsval, ns);
}
obj = ns;
js_register_autogentestbindings_SimpleNativeClass(cx, obj);
}
注意:如果你將「ts」添加到「test.ini」文件中的「target_namespace」變數里,便會自動生成代碼。無需修改。
target_namespace =ts
在「AppDelegate」中註冊
包含頭文件「autogentestbindings.hpp」然後註冊回調函數:
sc-addRegisterCallback(register_all_autogentestbindings);
在「hello.js」文件適當地方增加以下代碼。本機將「init f」函數放在第一個場景。
var myClass=new ts.SimpleNativeClass();
var myStr=myClass.returnsACString();
var label = cc.LabelTTF.create(myStr, “Helvetica”, 20.0);
限制
綁定生成器存在以下兩個限制
自變數數字參數無法工作,所以需要手動編寫包裝器
代表類無法工作,所以需要手動綁定,詳見下一部分。
手動 JSB 綁定
本指南將介紹利用Cocos2d-x 2.14模板如何在自己的項目中實現JSB綁定。
首先用Cocos2d-js模板創建項目。其次,我們會介紹如何一步一步從JS調用本地函數。最後你便會學會如何從本地代碼調用JS代碼了。
現在讓我們開始!本機使用的Mac OS X作為開發環境。
步驟1. 用Cocos2dx-js模板創建新項目,同時新建一個即將綁定至JS的C++類。
將項目命名為「JSBinding」然後點擊「Next」、「 Create」
新建一個類然後實現這個類,等會再將其綁定至JS。
按「command+N」新建一個C++類並命名為「JSBinding」,路徑為「OS X\C and C++\C++ Class」。
將以下代碼添加到「JSBinding.h」文件中。
#include “cocos2d.h”
#include “ScriptingCore.h”
// Define a namespace to manage your code and make your code clearly
namespace JSB {
class JSBinding: public cocos2d::CCObject
{
public:
static cocos2d::CCScene* scene();
virtual bool init();
CREATE_FUNC(JSBinding);
void functionTest();
};
}
現在實現JSBinding.cpp中的類。如下所示:
bool JSB::JSBinding::init(){
bool bRef = false;
do{
cocos2d::CCLog(“JSB init…”);
bRef = true;
} while (0);
return bRef;
}
void JSB::JSBinding::functionTest(){
cocos2d::CCLog(“Function test…”);
}
步驟2. 將C++代碼綁定至Java腳本代碼
按「command+N」新建C++類,然後命名「JSB_AUTO」路徑「OS X\C and C++\C++ Class」。
往「JSB_AUTO.h」文件中增加一些代碼
#include “jsapi.h”
#include “jsfriendapi.h”
#include “ScriptingCore.h”
#include “JSBinding.h”
void register_all(JSContext* cx, JSObject* obj);
然後注意「JSB_AUTO.cpp」的實現。
#include “jsapi.h”
#include “jsfriendapi.h”
#include “ScriptingCore.h”
#include “JSBinding.h”
void register_all(JSContext* cx, JSObject* obj);
然後注意「JSB_AUTO.cpp」的實現。
#include “cocos2d.h”
#include “cocos2d_specifics.hpp”
// Binding specific object by defining JSClass
JSClass* jsb_class;
JSObject* jsb_prototype;
// This function is mapping the function 「functionTest」 in 「JSBinding.cpp」
JSBool js_functionTest(JSContext* cx, uint32_t argc, jsval* vp){
JSBool ok = JS_TRUE;
JSObject* obj = NULL;
JSB::JSBinding* cobj = NULL;
obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t* proxy = jsb_get_js_proxy(obj);
cobj = (JSB::JSBinding* )(proxy ? proxy-ptr : NULL);
JSB_PRECONDITION2(cobj, cx, JS_FALSE, “Invalid Native Object”);
if (argc == 0) {
cobj-functionTest();
JS_SET_RVAL(cx, vp, JSVAL_VOID);
return ok;
}
JS_ReportError(cx, “Wrong number of arguments”);
return JS_FALSE;
}
JSBool js_constructor(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog(“JS Constructor…”);
if (argc == 0) {
JSB::JSBinding* cobj = new JSB::JSBinding();
cocos2d::CCObject* ccobj = dynamic_castcocos2d::CCObject*(cobj);
if (ccobj) {
ccobj-autorelease();
}
TypeTestJSB::JSBinding t;
js_type_class_t* typeClass;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, typeId, typeClass);
assert(typeClass);
JSObject* obj = JS_NewObject(cx, typeClass-jsclass, typeClass-proto, typeClass-parentProto);
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
js_proxy_t* p = jsb_new_proxy(cobj, obj);
JS_AddNamedObjectRoot(cx, p-obj, “JSB::JSBinding”);
return JS_TRUE;
}
JS_ReportError(cx, “Wrong number of arguments: %d, was expecting: %d”, argc, 0);
return JS_FALSE;
}
// This function is mapping the function 「create」 when using JavaScript code
JSBool js_create(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog(“js is creating…”);
if (argc == 0) {
JSB::JSBinding* ret = JSB::JSBinding::create();
jsval jsret;
do{
if (ret) {
js_proxy_t* proxy = js_get_or_create_proxyJSB::JSBinding(cx, ret);
jsret = OBJECT_TO_JSVAL(proxy-obj);
}
else{
jsret = JSVAL_NULL;
}
} while(0);
JS_SET_RVAL(cx, vp, jsret);
return JS_FALSE;
}
JS_ReportError(cx, “Wrong number of arguments”);
return JS_FALSE;
}
void js_finalize(JSFreeOp* fop, JSObject* obj){
CCLOGINFO(“JSBindings: finallizing JS object %p JSB”, obj);
}
// Binding JSB type
void js_register(JSContext* cx, JSObject* global){
jsb_class = (JSClass *)calloc(1, sizeof(JSClass));
jsb_class-name = “JSBinding”;
jsb_class-addProperty = JS_PropertyStub;
jsb_class-delProperty = JS_PropertyStub;
jsb_class-getProperty = JS_PropertyStub;
jsb_class-setProperty = JS_StrictPropertyStub;
jsb_class-enumerate = JS_EnumerateStub;
jsb_class-resolve = JS_ResolveStub;
jsb_class-convert = JS_ConvertStub;
jsb_class-finalize = js_finalize;
jsb_class-flags = JSCLASS_HAS_RESERVED_SLOTS(2);
static JSPropertySpec properties[] = {
{0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};
// Binding functionTest function
static JSFunctionSpec funcs[] = {
JS_FN(“functionTest”, js_functionTest, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding create() function
static JSFunctionSpec st_funcs[] = {
JS_FN(“create”, js_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding constructor function and prototype
jsb_prototype = JS_InitClass(
cx, global,
NULL,
jsb_class,
js_constructor, 0,
properties,
funcs,
NULL,
st_funcs);
JSBool found;
JS_SetPropertyAttributes(cx, global, “JSB”, JSPROP_ENUMERATE | JSPROP_READONLY, found);
TypeTestJSB::JSBinding t;
js_type_class_t* p;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, typeId, p);
if (!p) {
p = (js_type_class_t* )malloc(sizeof(_js_global_type_ht));
p-type = typeId;
p-jsclass = jsb_class;
p-proto = jsb_prototype;
p-parentProto = NULL;
HASH_ADD_INT(_js_global_type_ht, type, p);
}
}
// Binding JSB namespace so in JavaScript code JSB namespce can be recognized
void register_all(JSContext* cx, JSObject* obj){
jsval nsval;
JSObject* ns;
JS_GetProperty(cx, obj, “JS”, nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, “JSB”, nsval);
}
else{
JS_ValueToObject(cx, nsval, ns);
}
obj = ns;
js_register(cx, obj);
}
現在已經完成了大部分工作,但是我們需要在「SpiderMonkey」進行註冊。
打開「AppDelegate.cpp」增加以下代碼
ScriptingCore* sc = ScriptingCore::getInstance();
sc-addRegisterCallback(register_all); //add this line
步驟3. 內存管理
在register_all函數前增加兩個新函數。
JSBool JSB_cocos2dx_retain(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy-ptr)-retain();
CCLog(“Retain succeed!”);
return JS_TRUE;
}
}
JS_ReportError(cx, “Invaild native object”);
return JS_FALSE;
}
JSBool JSB_cocos2dx_release(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy-ptr)-release();
CCLog(“Release succeed!”);
return JS_TRUE;
}
}
JS_ReportError(cx, “Invaild native object”);
return JS_FALSE;
}
在register_all函數中增加以下代碼:
JS_DefineFunction(cx, jsb_prototype, “retain”, JSB_cocos2dx_retain, 0, JSPROP_READONLY | JSPROP_PERMANENT);
JS_DefineFunction(cx, jsb_prototype, “retain”, JSB_cocos2dx_release, 0, JSPROP_READONLY | JSPROP_PERMANENT);
步驟4. 使用C++代碼回調Java腳本代碼
在C++代碼回調Java腳本代碼之前增加一些代碼至「hello.js」文件。
var testJSB = new JSB.JSBinding();
testJSB.callback = function(i, j){
log(“JSB Callback” + i + j);
};
然後打開「JSBinding.cpp」在「functionTest」中增加一些代碼。
js_proxy_t* p = jsb_get_native_proxy(this);
jsval retval;
jsval v[] = {
v[0] = UINT_TO_JSVAL(32),
v[1] = UINT_TO_JSVAL(88)
};
ScriptingCore::getInstance()-executeFunctionWithOwner(OBJECT_TO_JSVAL(p-obj),
“callback”, 2, v, retval);
使用「executeFunctionWithOwner()」函數簡化函數調用程序
步驟5. 綁定測試
在「hello.js」文件中增加以下代碼。
var testJSB = new JSB.JSBinding();
testJSB.retain();
testJSB.functionTest();
testJSB.release();
步驟6. 現在取出(check out)項目
如果你的綁定程序正確無誤,將會在調試窗口看到如下界面:
恭喜你成功將JS綁定至本地代碼!
csgo 職業哥的cfg怎麼用
cfg文件保存位置:
將CFG文件粘貼到cfg文件夾根目錄下,路徑為」遊戲安裝盤\steam\steamapps\common\Counter-Strike Global Offensive\csgo\cfg「
cfg文件讀取:
進入遊戲開啟控制台後輸入”exec xx.cfg”即可,可以保存多個CFG文件,並綁定快捷鍵隨時切換。
擴展建議:
CFG文件設置包含了很多操作參數,很多人盲目地逼迫自己使用職業選手或明星主播的設置,其實是給自己下了個套,這些CFG里除了能優化遊戲性能的部分參數外有關鍵位、滑鼠速度等的設置還是根據個人偏好來,好比自己喜歡在遊戲中用左手,用了右手大神的cfg,不彆扭嗎?當然,職業哥的CFG肯定是進行了一定優化幫助遊戲體驗提升的,可以參考職業選手的cfg,綜合調整後創建適合自己風格的CFG!
CSGO職業選手cfg參數設置
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/129298.html