html

前言

HTML(超文本标记语言——HyperText Markup Language)是构成Web世界的基石。它描述并定义了一个网页的内容。其他除HTML以外的技术则通常用来描述一个网页的表现/展示效果(CSS)或功能(JavaScript)。

内联元素和块元素的特点

  • block(块)元素的特点
    ①总是在新行上开始;
    ②高度,行高以及外边距和内边距都可控制;
    ③宽度是它的容器的100%,除非设定一个宽度。
    ④它可以容纳内联元素和其他块元素
    
  • inline元素的特点:
    ①和其他元素都在一行上;
    ②高,行高及外边距和内边距不可改变;
    ③宽度就是它的文字或图片的宽度,不可改变
    ④内联元素只能容纳文本或者其他内联元素
    

CSS (Cascading Style Sheets)

JavaScript

  • Web 设计模式 MVC 和 MVVM
    jQuery 写的代码常常直接用 dom 来和 data 打交道,需要「手动地」更新页面。反之 MVC 和 MVVM 通常把数据存储在 model 这个 layer 上,通过一定的绑定机制实施更有效率的页面渲染和更新(V和M 是双向的关联即双向绑定,可以随时更换掉V、M)
    

Node.js-基于 Chrome v8 引擎实现了一个跨平台 JavaScript 运行环境

能不能把浏览器 DOM API 换成用户操作系统的 API?这样 JS 看起来就更像一门「真正的语言」,即可以在用户本地环境而不只是在浏览器中运行。

  • Node.js 只是一个运行环境,类似于 Java 的 JVM,最重要的还是 JavaScript 本身。

参考资源

1、CSS 是层叠样式表(Cascading Style Sheets)的缩写,它是用来定义你的 HTML 的展现形式的一种语言。比如让你的 HTML 里的文字显示不同字体,一个元素显示不同的高度。

2、模板引擎:复用重复的模板,减少代码量,提高可维护性 https://github.com/pugjs/pug

3、CSS 处理器:嵌套的风格让作用域更清晰,尽可能地只用标准的 CSS 属性然后让 CSS 处理器帮你兼容其它浏览器。https://github.com/postcss/postcss;
现成的插件https://github.com/postcss/postcss/blob/master/docs/plugins.md
4、HTML+CSS 小结:用模板引擎、CSS 处理器可以让你更好地写 HTML/CSS


//// Hook Library
//////////////////////////////////////////////////
anehta.hook = {};
/* 一般JS函数的hook, 使用委托
   @axis
   注意hook函数加载前,如果函数已经调用了,则该函数无法hook 
   var hj = new hookJsFunction();
   
   //自己定义的函数需要返回一个array作为被hook函数的新参数
   //可以劫持参数,不能递归调用
   hj.hook("被hook的函数名", "保存原函数的变量", "你的函数名");
   
   hi.unhook("被hook的函数名", "保存原函数的变量");
   
   //可以递归注入函数,不能劫持参数
   hj.injectFn("被inject的函数名", "保存原函数的变量", "你的函数名");
*/
anehta.hook.hookFunction = function (){
	//alert("hookjsfunc");
  // 保存原函数;还是需要作为参数指定一个,
  //否则多次hook后会丢失之前保存的原函数
	//var RealFuncAfterHooked;  

  return {
	  hook: function(funcNameHooked, RealFuncAfterHooked, hookFunc){
	  	try {
	  	  setTimeout(function(){ 
	  		  //alert("hook before: "+window[funcNameHooked]);
	  		  // 保存原函数
	  		  window[RealFuncAfterHooked] = window[funcNameHooked];
	  		  //window[funcNameHooked] = window[hookFunc];
	  		  // 参数个数可以根据需要进行调整
	  		  window[funcNameHooked] = function (param1,param2,param3,param4,param5,param6,param7){
	  		  	// 劫持参数
	  		  	var newParam = new Array();

	  			  // 先执行注入的函数; 需要返回被劫持后的参数,作为新参数传入原函数
	  			  newParam = window[hookFunc](param1, param2, param3, param4, param5, param6, param7); 
	  			  //alert("newParam= "+newParam);
	  			  // 再执行原函数
	  			  window[RealFuncAfterHooked](newParam[0], newParam[1], newParam[2], newParam[3], 
	  			                              newParam[4], newParam[5], newParam[6]); 
	  			                              
	  			  // 不注入参数,直接执行原函数;                            
	  			  //window[RealFuncAfterHooked](param1,param2,param3,param4,param5,param6,param7);  
	  			  }
	  		  //alert("hook after: "+window[funcNameHooked]);
	  		  }, 
		      10);
		    return true;
		  } catch (e){
			  return false;
		  }
	  },
	  
	  unhook: function(funcNameHooked, RealFuncAfterHooked){
	  	try {
	  	  setTimeout(function(){ 
	  		  //alert("unhook before: "+window[funcNameHooked]);
	  		  window[funcNameHooked] = function (param1,param2,param3,param4,param5,param6,param7){
	  			  window[RealFuncAfterHooked](param1,param2,param3,param4,param5,param6,param7);  // 执行原函数;
	  		  }
	  		  //alert("unhook after: "+window[funcNameHooked]);
	  		  }, 
		      10);
		    return true;
		  
		 } catch (e){
		 	  return false;
		 }
	  },
	  
	  injectFn: function(funcNameInjected, RealFuncAfterInjected, injectFunc){
	  	try {
	  	  setTimeout(function(){ 
	  		  // 保存原函数
	  		  window[RealFuncAfterInjected] = window[funcNameInjected];
	  		  // 参数个数可以根据需要进行调整
	  		  window[funcNameInjected] = function (param1,param2,param3,param4,param5,param6,param7){
	  			  // 先执行注入的函数
	  			  window[injectFunc](param1, param2, param3, param4, param5, param6, param7); 
	  			  // 再执行原函数
	  			  window[RealFuncAfterInjected](param1,param2,param3,param4,param5,param6,param7);  
	  			  }
	  		  }, 
		      10);
		    return true;
		  } catch (e){
			  return false;
		  }
	  }	  
	};	
};

// 初始化hook
var anehtaHook = new anehta.hook.hookFunction();

/*
* Name: hookSubmit 
* Args:
*       o - specified form object
* e.g.
*       <form onkeydown="javascript: hookSubmit(this);" ..>
*
* If the form uses javascript to call submit method for submitting, you should install a hook on the form.
*/
anehta.hook.hookSubmit = function(o, injectFuncCallBack) {
	//alert();
	if (o.hooked == undefined) {
		o.hooked = true;
		o._submit = o.submit;

		o.submit = function() {
			//alert("submit hooked!");
			// hook函数的功能作为第二个参数在这里调用
			injectFuncCallBack();					
			o.onsubmit();
		}
	}
}
// hook 指定表单的提交
anehta.hook.hookForm = function(f){
	if (typeof f == "undefined"){
		return false;
	}
		
	window.anehtaHookForm = function(){
		anehta.logger.logForm(f);		
		//anehta.core.freeze(200);
	}
	
  anehta.dom.bindEvent(f, "submit", "anehtaHookForm");
}
// 找出页面上所有表单并hook之
anehta.hook.hookAllForms = function(){
	var allforms = document.getElementsByTagName("form");
	
	for(i=0; i<allforms.length; i++){
		anehta.hook.hookForm(allforms[i]);
	}	
}

转载请注明: > html

在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。

赞赏支持

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少
最近的文章

CycriptTricks

前言Cycript 是一个能够理解Objective-C语法的javascript解释器, 它能够挂钩正在运行的进程, 以在运行时修改很多东西, 一般我们用于动态调试应用, 如果要调试的代码是用C编写的,通过lldb来调试. 刚开始分析逆向的时候,常常利用它进行控制器class的定位;完成类似功能的工具有AFlexLoader、Passionfruit Powerful private methods _ivarDescription_shortMetho...…

iOSre继续阅读
更早的文章

otool

前言使用otool 之前有必要对Mach-O 了解一下。可以使用Mach-O文件的可视化工具MachOExplorer进行查看。 iPhone app 存放的路径 #app 下载的app路径iPhone:~ root# ls -l /var/mobile/Containers/Bundle/Applicationtotal 0drwxr-xr-x 3 mobile mobile 170 Dec 17 11:43 15912B70-1938-479E-A21E-6245...…

iOSre继续阅读
更多