~~~
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace think;
//基于 最基礎的think命名空間
use think\exception\ClassNotFoundException;
//use think\exception\ClassNotFoundException;
//運行 未發現類 異常
class Loader
{//加載類
protected static $instance = [];//受保護靜態的類名映射 也就是實例化了
// 類名映射
protected static $map = [];//類映射 存儲位置 映射 存儲關系
// 命名空間別名
protected static $namespaceAlias = [];//別名 命名空間 別名
// PSR-4
private static $prefixLengthsPsr4 = [];
private static $prefixDirsPsr4 = [];
private static $fallbackDirsPsr4 = [];
// PSR-0
private static $prefixesPsr0 = [];
private static $fallbackDirsPsr0 = [];
// 自動加載的文件
private static $autoloadFiles = [];
// 自動加載
public static function autoload($class)//這個就加載文件
{//自動加載類//加載一個class
// 檢測命名空間別名
if (!empty(self::$namespaceAlias)) {//如果有命名空間
$namespace = dirname($class);//通過類名的路徑來命名空間
if (isset(self::$namespaceAlias[$namespace])) {//如果有別名,通過路徑來dirname
$original = self::$namespaceAlias[$namespace] . '\\' . basename($class);
//鏈接為最新的$original
if (class_exists($original)) {//檢查類是否已定義
return class_alias($original, $class, false);//為這個類創建別名
// 如果存在這個 真實的 class_alias 別名: 然后 進入到對應到的 class
}
}
}
if ($file = self::findFile($class)) {//查找這個類名的文件
// Win環境嚴格區分大小寫
if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
return false;
}
__include_file($file);//加載文件(下面有方法 )
return true;
}
}// 這個函數的意思,基本上就是 自動加載對應的文件 類文件
/**
* 查找文件
* @param $class
* @return bool
*/
private static function findFile($class)//查找文件
{
if (!empty(self::$map[$class])) {//如果文件存在類映射
// 類庫映射
return self::$map[$class];//返回類名映射
}
// 查找 PSR-4
$logicalPathPsr4 = strtr($class, '\\', DS) . EXT;//返回第一節數據
$first = $class[0];//獲取最新的數據
if (isset(self::$prefixLengthsPsr4[$first])) {//如果設置了這個預定義變量
foreach (self::$prefixLengthsPsr4[$first] as $prefix => $length) {//循環
if (0 === strpos($class, $prefix)) {//找到文件//strops查找字符串首次出現的位置
foreach (self::$prefixDirsPsr4[$prefix] as $dir) {//loop目錄
if (is_file($file = $dir . DS . substr($logicalPathPsr4, $length))) {
return $file;
}//如果文件存在就返回
}
}
}
}
// 查找 PSR-4 fallback dirs
foreach (self::$fallbackDirsPsr4 as $dir) {
if (is_file($file = $dir . DS . $logicalPathPsr4)) {//如果有fallback Dirs Psr4 循環展示
return $file;
}
}
//如果有這個標準下的文件,返回文件
// 查找 PSR-0
if (false !== $pos = strrpos($class, '\\')) {//如果這里//strrpos計算字符串在目標字符串中最后一次出現的位置
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DS);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DS) . EXT;//這里獲取另外一種方式
}
if (isset(self::$prefixesPsr0[$first])) {//如果含有這個first 就是class里面的第一個
foreach (self::$prefixesPsr0[$first] as $prefix => $dirs) {//循環這里的dir
if (0 === strpos($class, $prefix)) {//如果開始就存在這個$prefix
foreach ($dirs as $dir) {//循環數據
if (is_file($file = $dir . DS . $logicalPathPsr0)) {
return $file;
}
}
}
}
}//有這樣的格式的數據,直接返回,而且,是循環的
// 查找 PSR-0 fallback dirs
foreach (self::$fallbackDirsPsr0 as $dir) {
if (is_file($file = $dir . DS . $logicalPathPsr0)) {
return $file;
}
}
return self::$map[$class] = false;//否則返回數據
}
// 注冊classmap
public static function addClassMap($class, $map = '')
{//addClassMap類文件映射,支持數組,或者key value兩種方式
if (is_array($class)) {
self::$map = array_merge(self::$map, $class);//array_merge 合并數組
} else {
self::$map[$class] = $map;
}
}
// 注冊命名空間
public static function addNamespace($namespace, $path = '')
{//新增命名空間注冊
//特點:就是支持key value和數組賦值方式
if (is_array($namespace)) {
foreach ($namespace as $prefix => $paths) {
self::addPsr4($prefix . '\\', rtrim($paths, DS), true);
}
} else {
self::addPsr4($namespace . '\\', rtrim($path, DS), true);
}
}
// 添加Ps0空間
private static function addPsr0($prefix, $paths, $prepend = false)
{
//如果不存在prefix
//把數據給$fallbackDirsPsr0
//prepend代表:是配置大于約定還是,約定大于配置,這個是常用的手法,不錯!
if (!$prefix) {//如果沒有對應的namespace或者前綴
if ($prepend) {//默認的是false,傳入的是true 正常調試就是執行這個
self::$fallbackDirsPsr0 = array_merge(
(array)$paths,
self::$fallbackDirsPsr0
);//充分使用了array_merge對于不同位置的覆蓋方向不一樣,導致的。
} else {
self::$fallbackDirsPsr0 = array_merge(
self::$fallbackDirsPsr0,
(array)$paths
);
}
//直接返回了 不會向下執行了
return;//同樣深層次支持
}
//如果存在first
//配置到對應的prefix
$first = $prefix[0];//如果有這個first
if (!isset(self::$prefixesPsr0[$first][$prefix])) {//如果沒有這個
self::$prefixesPsr0[$first][$prefix] = (array)$paths;//設置,然后返回
return;
}
//默認,有設置的,合并
if ($prepend) {
self::$prefixesPsr0[$first][$prefix] = array_merge(
(array)$paths,
self::$prefixesPsr0[$first][$prefix]
);
} else {
self::$prefixesPsr0[$first][$prefix] = array_merge(
self::$prefixesPsr0[$first][$prefix],
(array)$paths
);
}
}
// 添加Psr4空間
private static function addPsr4($prefix, $paths, $prepend = false)
{//同樣的代碼
if (!$prefix) {
// Register directories for the root namespace.為根名稱空間注冊目錄。
if ($prepend) {
self::$fallbackDirsPsr4 = array_merge(
(array)$paths,
self::$fallbackDirsPsr4
);
} else {
self::$fallbackDirsPsr4 = array_merge(
self::$fallbackDirsPsr4,
(array)$paths
);
}
} elseif (!isset(self::$prefixDirsPsr4[$prefix])) {//注冊如果沒有這些
// Register directories for a new namespace.為一個新的名稱空間注冊目錄。
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {//長度
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
self::$prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
self::$prefixDirsPsr4[$prefix] = (array)$paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.已注冊名稱空間的預pend目錄。
self::$prefixDirsPsr4[$prefix] = array_merge(
(array)$paths,
self::$prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.為已經注冊的名稱空間添加目錄。
self::$prefixDirsPsr4[$prefix] = array_merge(
self::$prefixDirsPsr4[$prefix],
(array)$paths
);
}
}
// 注冊命名空間別名
public static function addNamespaceAlias($namespace, $original = '')
{
if (is_array($namespace)) {
self::$namespaceAlias = array_merge(self::$namespaceAlias, $namespace);
} else {
self::$namespaceAlias[$namespace] = $original;
}
}
/**
* 使用這個自動加載函數
* 注冊自動加載機制
* @param string $autoload
*/
public static function register($autoload = '')
{// 重點!重點!重點!重點!重點!重點!重點!重點!重點!重點!重點!
// 注冊系統自動加載
spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);
// spl_autoload_register 將函數注冊到SPL __autoload函數隊列中。如果該隊列中的函數尚未激活,則激活它們。
// 進行 系統加載 函數 自動注冊
// 自動 加載文件 // 特點,就是 用的時候,自動加載, 優于當年的 全部加載,這個也是他宣傳的按需加載!
// 如果沒有 對應需要 提前加載的東西,默認的 就是 檢測文件是否正確,
// 直接使用 return include 進行
// 通過 class 名字,按照 不同的 標準 進行 加載, 更多的國際化了,你進步了
// 其實這個里面的 核心 技術應該是 對應 不同標準的 Ps0 跟 Ps4 標準的 路徑的獲取
// 實現不同 標準下的 類文件加載
// 這個挺關鍵
// 注冊命名空間定義
self::addNamespace([
'think' => LIB_PATH . 'think' . DS,
'behavior' => LIB_PATH . 'behavior' . DS,
'traits' => LIB_PATH . 'traits' . DS,
]);//開始對命名空間進行配置
// 加載類庫映射文件
if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {
self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));
}
// Composer自動加載支持
if (is_dir(VENDOR_PATH . 'composer')) {
self::registerComposerLoader();
}
// 自動加載extend目錄
self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);
}
// 注冊composer自動加載
private static function registerComposerLoader()
{//默認沒有不會執行
if (is_file(VENDOR_PATH . 'composer/autoload_namespaces.php')) {
$map = require VENDOR_PATH . 'composer/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
self::addPsr0($namespace, $path);
}
}//加載命名空間
if (is_file(VENDOR_PATH . 'composer/autoload_psr4.php')) {
$map = require VENDOR_PATH . 'composer/autoload_psr4.php';
foreach ($map as $namespace => $path) {
self::addPsr4($namespace, $path);
}
}//加載Psr4標準
if (is_file(VENDOR_PATH . 'composer/autoload_classmap.php')) {
$classMap = require VENDOR_PATH . 'composer/autoload_classmap.php';
if ($classMap) {
self::addClassMap($classMap);
}
}//加載classmap
if (is_file(VENDOR_PATH . 'composer/autoload_files.php')) {
$includeFiles = require VENDOR_PATH . 'composer/autoload_files.php';
foreach ($includeFiles as $fileIdentifier => $file) {
if (empty(self::$autoloadFiles[$fileIdentifier])) {
__require_file($file);
self::$autoloadFiles[$fileIdentifier] = true;
}
}
}//加載文件
}
/**
* 導入所需的類庫 同java的Import 本函數有緩存功能
* @param string $class 類庫命名空間字符串
* @param string $baseUrl 起始路徑
* @param string $ext 導入的文件擴展名
* @return boolean
*/
public static function import($class, $baseUrl = '', $ext = EXT)
{//導入類文件
static $_file = [];//靜態文件倉庫
$key = $class . $baseUrl;//key文件
$class = str_replace(['.', '#'], [DS, '.'], $class);//處理class
if (isset($_file[$key])) {
return true;
}//如果加載過了這個文件,就直接
if (empty($baseUrl)) {//如果起始路徑為空,就是默認值
list($name, $class) = explode(DS, $class, 2);//返回 類的 前面兩個數組
if (isset(self::$prefixDirsPsr4[$name . '\\'])) {//如果存在這個Psr4
// 注冊的命名空間
$baseUrl = self::$prefixDirsPsr4[$name . '\\'];
} elseif ('@' == $name) {
//加載當前模塊應用類庫
$baseUrl = App::$modulePath;//獲取@方式
} elseif (is_dir(EXTEND_PATH . $name)) {
$baseUrl = EXTEND_PATH . $name . DS;//獲取基礎地址
} else {
// 加載其它模塊的類庫
$baseUrl = APP_PATH . $name . DS;
}
} elseif (substr($baseUrl, -1) != DS) {
$baseUrl .= DS;
}//獲取baseUrl
// 如果類存在 則導入類庫文件
if (is_array($baseUrl)) {//如果基礎地址為baseUrl
foreach ($baseUrl as $path) {
$filename = $path . DS . $class . $ext;//baseUrl
if (is_file($filename)) {
break;//找到了文件就退出
}
}
} else {
$filename = $baseUrl . $class . $ext;
}
if (!empty($filename) && is_file($filename)) {// 如果 沒有 文件, 如果有這個文件
// 開啟調試模式Win環境嚴格區分大小寫
if (IS_WIN && pathinfo($filename, PATHINFO_FILENAME) != pathinfo(realpath($filename), PATHINFO_FILENAME)) {
return false;
}// 如果路徑 不行
__include_file($filename);// 加載文件
$_file[$key] = true;// 執行 狀態
return true;
}
return false;
}
/**
* 實例化(分層)模型
* @param string $name Model名稱
* @param string $layer 業務層名稱
* @param bool $appendSuffix 是否添加類名后綴
* @param string $common 公共模塊名
* @return object
* @throws ClassNotFoundException
*/
public static function model($name = '', $layer = 'model', $appendSuffix = false, $common = 'common')
{// 獲取對應的信息
$guid = $name . $layer;
if (isset(self::$instance[$guid])) {
return self::$instance[$guid];
}// 不同的 層 跟 不同的 名字 就可以確定 不同的 model
// 對應到 不同的 key
if (false !== strpos($name, '\\')) {
$class = $name;
$module = Request::instance()->module();
} else {
if (strpos($name, '/')) {// 如果你的名字不純潔 那么就要處理你
list($module, $name) = explode('/', $name, 2);//默認給到的 就是 list 方式
} else {
$module = Request::instance()->module();// 否則 應該會自動加載了,這個位置,不是初始化調用的地方
}
$class = self::parseClass($module, $layer, $name, $appendSuffix);// 獲取到對應的 類 名 , this class name
}
if (class_exists($class)) {// 找到的這個class變量,如果是個 class 的話,就使用他
$model = new $class(); // 好用法
} else {
$class = str_replace('\\' . $module . '\\', '\\' . $common . '\\', $class);
if (class_exists($class)) {// 如果可以了
$model = new $class();// 執行他
} else {// 否則的話 拋出 類 異常
// 這里可以補充一下, 其實應該是 model class not exists:
throw new ClassNotFoundException('class not exists:' . $class, $class);
}
}
self::$instance[$guid] = $model;// 存入 key value 關鍵字
return $model;// 返回 數據
}
/**
* 實例化(分層)控制器 格式:[模塊名/]控制器名
* @param string $name 資源地址
* @param string $layer 控制層名稱
* @param bool $appendSuffix 是否添加類名后綴
* @param string $empty 空控制器名稱
* @return object
* @throws ClassNotFoundException
*/
public static function controller($name, $layer = 'controller', $appendSuffix = false, $empty = '')
{
if (false !== strpos($name, '\\')) {
$class = $name;
$module = Request::instance()->module();
} else {
// 第一步: 獲取對應的 model
// 通過 不同的 方式 1
// 方式2
if (strpos($name, '/')) {
list($module, $name) = explode('/', $name);
} else {
$module = Request::instance()->module();
}
// 第二步: 獲取 class
$class = self::parseClass($module, $layer, $name, $appendSuffix);
}
// 第三步:對獲取的class 進行 驗證,存在,就
if (class_exists($class)) {
return App::invokeClass($class);// 返回
} elseif ($empty && class_exists($emptyClass = self::parseClass($module, $layer, $empty, $appendSuffix))) {
return new $emptyClass(Request::instance());// 返回空的
} else {
throw new ClassNotFoundException('class not exists:' . $class, $class);
// 看來進步了,沒有報錯
}
}
/**
* 實例化驗證類 格式:[模塊名/]驗證器名
* @param string $name 資源地址
* @param string $layer 驗證層名稱
* @param bool $appendSuffix 是否添加類名后綴
* @param string $common 公共模塊名
* @return object|false
* @throws ClassNotFoundException
*/
public static function validate($name = '', $layer = 'validate', $appendSuffix = false, $common = 'common')
{
// 進行驗證,驗證類型:
// 名字 層名字 前綴
$name = $name ?: Config::get('default_validate');// 獲取驗證規則 地址
if (empty($name)) {// empty $name 如果文件為空,直接返回
return new Validate;// 新的 驗證類 Validate 新的驗證類
}
$guid = $name . $layer;
if (isset(self::$instance[$guid])) {// 存在就直接返回
return self::$instance[$guid];
}// 如果已經 驗證了
if (false !== strpos($name, '\\')) {
$class = $name;
$module = Request::instance()->module();
} else {
if (strpos($name, '/')) {
list($module, $name) = explode('/', $name);
} else {
$module = Request::instance()->module();
}
// 獲取類
$class = self::parseClass($module, $layer, $name, $appendSuffix);
}
if (class_exists($class)) {// 如果類存在
$validate = new $class;// 生成 新類
} else {
$class = str_replace('\\' . $module . '\\', '\\' . $common . '\\', $class);// 如果 獲取類
if (class_exists($class)) {
$validate = new $class;// 返回新 類
} else {
throw new ClassNotFoundException('class not exists:' . $class, $class);
}
}// 你懂的 類不存在了
self::$instance[$guid] = $validate;// 存檔 備查詢
return $validate;
}
/**
* 數據庫初始化 并取得數據庫類實例
* @param mixed $config 數據庫配置
* @param bool|string $name 連接標識 true 強制重新連接
* @return \think\db\Connection
*/
public static function db($config = [], $name = false)
{
return Db::connect($config, $name);
}// 數據庫 初始化 并取得 數據庫 實例
/**
* 遠程調用模塊的操作方法 參數格式 [模塊/控制器/]操作
* @param string $url 調用地址
* @param string|array $vars 調用參數 支持字符串和數組
* @param string $layer 要調用的控制層名稱
* @param bool $appendSuffix 是否添加類名后綴
* @return mixed
*/
public static function action($url, $vars = [], $layer = 'controller', $appendSuffix = false)
{
$info = pathinfo($url);// 獲取 url 地址信息
$action = $info['basename'];// 獲取 action 方式
$module = '.' != $info['dirname'] ? $info['dirname'] : Request::instance()->controller();
// 獲取 中間值 module
$class = self::controller($module, $layer, $appendSuffix);// 獲取 class 名稱
if ($class) {// 如果存在 class
if (is_scalar($vars)) {// 如果是標準量//is_scalar — 檢測變量是否是一個標量
if (strpos($vars, '=')) {// strpos
parse_str($vars, $vars);// 解析字符串//parse_str — 將字符串解析成多個變量
} else {
$vars = [$vars];// 這個強轉換 漂亮
}
}
return App::invokeMethod([$class, $action . Config::get('action_suffix')], $vars);
}//return App:: 驗證文件是否存在
}
/**
* 字符串命名風格轉換
* type 0 將Java風格轉換為C的風格 1 將C風格轉換為Java的風格
* @param string $name 字符串
* @param integer $type 轉換類型
* @param bool $ucfirst 首字母是否大寫(駝峰規則)
* @return string
*/
public static function parseName($name, $type = 0, $ucfirst = true)
{// 轉換字符串 風格的 一個小函數,如果1 就大寫,否則就小寫
if ($type) {
$name = preg_replace_callback('/_([a-zA-Z])/', function ($match) {
return strtoupper($match[1]);
}, $name);
return $ucfirst ? ucfirst($name) : lcfirst($name);
} else {
return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
}
}
/**
* 解析應用類的類名
* @param string $module 模塊名
* @param string $layer 層名 controller model ...
* @param string $name 類名
* @param bool $appendSuffix
* @return string
*/
public static function parseClass($module, $layer, $name, $appendSuffix = false)
{// 解析 Class 類名
$name = str_replace(['/', '.'], '\\', $name);// 替換類名
$array = explode('\\', $name);// 解析類資源
$class = self::parseName(array_pop($array), 1) . (App::$suffix || $appendSuffix ? ucfirst($layer) : '');
$path = $array ? implode('\\', $array) . '\\' : '';
return App::$namespace . '\\' . ($module ? $module . '\\' : '') . $layer . '\\' . $path . $class;
}// 解析 類名
/**
* 初始化類的實例
* @return void
*/
public static function clearInstance()
{
self::$instance = [];
}// 初始化,就是 清空實例
}
/**
* 作用范圍隔離
*
* @param $file
* @return mixed
*/
function __include_file($file)
{
return include $file;
}// 封裝,暫時不用加載那個 commons.php
function __require_file($file)
{
return require $file;
}// 封裝,默認加載
~~~
- Thinkphp5
- 目錄結構
- Url和路由
- PHP
- PHP常用函數
- 學習PHP之路
- 自定義有用函數
- Gif驗證碼動圖
- 單態
- 字符串
- PHP的echo輸出內容過多會很慢
- PHP中的大括號{}使用
- PHP性能優化:使用isset()判斷字符串長度比strlen()更快
- php被遺忘的強大的字符串處理函數
- php如何將html中的br換行符轉換為文本輸入中的換行符
- PHP字符串轉義函數(addslashes,stripslashes)詳解
- 如何知道服務器是否支持Gzip壓縮
- PHP合并數組+與array_merge的區別
- PHP利用正則過濾各種標簽,空格,換行符的代碼
- PHP數字判斷函數
- PHP中0和空的區別
- PHP中的session和cookie的區別
- PHP過濾字符串函數
- PHP中empty,is_null,isset的區別詳解
- PHP獲取utf8字符串的字符長度
- PHP函數總結
- php取漢字的第一個字的首字母
- php計算兩個時間戳之間相差的日時分秒的兩種方法
- php中array_push 與 $arr[]=$value 性能比較分析
- PHP給源代碼加密的幾種方法
- 計算二維數組中某一元素Key之和
- 常用函數(String&Array&math)
- String去空格或其他字符串
- String字符串生成和轉化
- String大小寫轉換
- StringHtml標簽相關
- String字符串比較
- String字符串查找和替換
- String字符串的切割和拼接
- String字符串統計
- String字符串編碼
- Array創建數組
- Array數組的合并和拆分
- MySQL多表查詢
- TP5源碼閱讀
- Loader
- View
- 項目實踐
- 圖書管理系統
- 系統需求分析
- 數據庫設計
- javascript實例
- 基礎
- 1.switch語句流程控制
- 2.比較運算符
- 3.表達式計算順序
- 4.單擊按鈕時調用函數
- 5.遞增、遞減運算符
- 6.定義css樣式表
- 7.多個函數同時調用
- 8.多條件的選取(if)
- 9.多重選取(if)
- 10.加載一個外部的CSS樣式表
- 11.檢查變量的類型
- 12.檢查變量是否存在
- 13.將1--10之間的奇偶數分開
- 14.將數字轉化為字符串
- 15.字符串轉換為數字
- 16.矩形面積計算
- 17.絕對值函數的使用
- 18.例外處理
- 19.鏈接兩個數組
- 20.邏輯運算符
- 21.判斷一個對象是否存在
- 22.平方根函數的使用
- 23.球體面積計算
- 24.取得對象的編號
- 25.取得類別的名稱
- 26.取得兩個數中的最大數
- 27.取得數組的大小
- 28.取整函數的使用
- 29.三角形面積計算
- 30.三元運算符
- 31.刪除數組變量
- 32.聲明數組
- 33.聲明一個對象
- 34.聲明一個自定函數
- 35.使用javascript
- 36.使用vbscript
- 37.使用with省略對象名稱
- 38.顯示input框輸入值
- 39.使用對象
- 40.使用循環存取數組
- 41.數組排序sort
- 42.雙重選取(if)
- 43.四舍五入函數的使用
- 44.算術賦值運算符
- 45.算術運算符
- 46.隨機函數
- 47.條件選擇(if)
- 48.危險(使用無窮循環凍結網頁)
- 49.圓形面積計算
- 50.在JavaScript中使用變量
- 51.在指定的時間調用一次函數
- 52.在指定的時間反復調用函數
- 53.在指定外部Behavior文件作為JavaScript來源
- 54.指定一個js文件作為JavaScript來源
- 55.重復執行(for)
- 56.重復執行(while)
- 鏈接
- 1.按鈕式超鏈接
- 2.超鏈接確認對話框
- 3.單機按鈕鏈接到指定的網頁
- 4.定時改變超鏈接文字的顏色
- 5.定時滾動超鏈接
- 6.定時前往其他頁面
- 7.關閉窗口超鏈接
- 8.取得目標頁面中的網址
- 9.取得頁面的超鏈接數
- 10.取得頁面中所有超鏈接地址
- 11.設定超鏈接樣式
- 12.隨機產生超鏈接地址
- 13.隨機顯示網頁
- 14.頁面載入等待
- 15.制作登錄的密碼驗證功能
- 事件
- 1.單機跟雙擊鼠標事件
- 2.給網頁設定快捷鍵
- 3.跟隨鼠標移動的圖片
- 4.跟隨鼠標移動的文字
- 5.檢查是否按下Ctrl、alt、shift
- 6.跟隨鼠標移動的星星
- 7.將按下的按鈕顯示在頁面上
- 8.交換式圖片按鈕
- 9.進入、離開網頁顯示信息
- 10.禁止單擊鼠標右鍵
- 11.絕對禁止單擊鼠標右鍵
- 12.可以鼠標拖動文字
- 13.取得按鍵的ASCII碼
- 14.取得按下的按鍵
- 15.取得鍵盤的方向鍵
- 16.取得鼠標的按鍵
- 17.取得鼠標在網頁中XY坐標
- 18.取得鼠標xy坐標
- 19.使用鼠標拖動圖片
- 20.使用外部鼠標指針樣式
- 21.鼠標經過是改變一列表格的樣式
- 22.鼠標控制文字的滾動
- 23.網頁彈出菜單
- 24.網頁樹形目錄
- 25.網頁下拉菜單
- 26.顯示不同的鼠標指針樣式
- 27.顯示或隱藏圖片
- 28.用方向鍵來控制圖片移動
- 29.在超鏈接上顯示提示信息
- 30.在鼠標單擊出顯示圖片
- 表單處理
- 1.查看文字字段的內容
- 2.從文件字段中選取一個圖片作為背景圖
- 3.帶標簽的復選框
- 4.單機選項按鈕改變背景顏色
- 5.讀取表單所有元素的名稱
- 6.防止表單多次發送
- 7.改變目前選取的選項按鈕顏色
- 8.改變文字區域的寬度
- 9.改變文字字段中文字對齊的方向
- 10.檢查兩個復選框是否同時選擇
- 11.檢驗一個復選框是否選中
- 12.檢驗一組復選框是否選中
- 13.檢驗一組選項按鈕的選擇情況
- 14.接觸所有復選框的選取
- 15.連動方式選項按鈕
- 16.取得文字中選取圖片的高度
- 17.取得列表選取的多個值
- 18.取得文件中選取的文件名稱
- 19.取得文件字段中選取圖片大小
- 20.取得文件字段中選取文件的擴展名
- 21.取得文字區域中文字的行數
- 22.取得下拉菜單中的選取值
- 23.取得下拉菜單中選取項目的索引值
- 24.全選或取消的復選框
- 25.全選所有復選框
- 26.使用E-Mail發送表單
- 27.使用鍵盤選擇文字字段
- 28.使用文字字段取得focus
- 29.鼠標經過改變文字邊框顏色
- 30.鼠標經過改變文字背景顏色
- 31.鼠標經過改變文字顏色
- 32.鼠標經過時選取文字
- 33.雙重輸入文字
- 34.隨機設置表單的發送地址
- 35.跳頁菜單的實現
- 36.圖片發送按鈕
- 37.文字字段自動調整大小
- 38.限制文字區域輸入文字字數
- 39.限制文字區域輸入文字行數
- 40.相當于發送按鈕的超鏈接
- 41.相當于重置按鈕的超鏈接
- 42.驗證文字字段是否有輸入資格
- 43.驗證輸入的日期格式
- 44.驗證輸入的日期格式2
- 45.驗證輸入的是否為數字
- 46.驗證輸入的是否為郵箱
- 47.驗證輸入的是否為字母
- 48.一個簡單的計算器
- 49.以圖片顯示輸入的數字
- 50.允許或禁止對整個表單的訪問
- 51.在文字區域中添加一行文字
- 52.在文字區域中移動光標的位置
- 53.在新窗口中打開網頁
- 54.在新窗口中顯示表單內容
- 55.制作谷歌搜索表單
- 56.自動切換為英文輸入模式
- 圖片處理
- 1.定時更換圖片
- 2.改變圖片重疊順序
- 3.滾動圖片
- 4.灰度、相反、X光效果
- 5.禁止圖片下載
- 6.漫天飛舞的雪花
- 7.每隔一段時間更換廣告圖片
- 8.設定背景的漸變效果
- 9.使用百葉窗效果來更換圖片
- 10.使用水平棋盤來更換圖片
- 11.始終在右下角的圖片
- 12.水中倒影的效果
- 13.隨機水平細紋效果來更換圖片
- 14.隨機顯示圖片
- 15.圖片不停閃爍效果
- 16.圖片大小變換
- 17.圖片漸變出現
- 18.圖片扭曲變形效果
- 19.圖片漸隱效果
- 20.相片選擇器
- 21.移動圖片位置
- 22.預先載入圖片
- 檢查與驗證
- 1.檢查是否為ip地址
- 2.檢查是否為url
- 3.檢查是否為電子郵件地址
- 4.檢查是否為日期
- 5.檢查是否為時間
- 6.檢查是否為數字和字母
- 7.檢查是否為郵政編碼
- 8.檢查是否為數字
- 9.檢查是否為字母
- 10.利用正則表達式出去字符串
- 日期與時間
- 1.帶開關的時鐘
- 2.倒影計時
- 3.分別取得當前時分秒
- 4.分別取得目前年月日
- 5.計算未來的時間
- 6.節日倒計時
- 7.取得距離基準時間制定的毫秒
- 8.全中文日期顯示
- 9.顯示時間停留
- 10.顯示有上下午時間
- 11.顯示指定日期
- 12.以本地格式顯示日期/時間
- 13.在標題欄中動態顯示日期
- 14.在標題欄中顯示日期
- 15.在不同時間顯示不同的提示
- 16.在網頁中顯示目前的日期/時間
- 17.在網頁中顯示目前是星期幾
- 18.在網頁中顯示中文日期和中文星期
- 19.在文字藍中動態顯示時間
- 20.在頁面指定位置動態顯示時間
- 21.在狀態欄中動態顯示時間
- 22.在狀態欄中顯示日期
- Browers
- 1.獲取操作系統名稱
- 2.獲取瀏覽器版本
- 3.檢查瀏覽器安裝的插件
- 4.檢測是否安裝了Flash插件
- 5.獲取用戶信息
- 6.獲取瀏覽器名稱
- Cookie
- 1.獲取Cookie的值
- 2.記錄瀏覽網站的時間
- 3.記錄瀏覽者的姓名
- 4.記住登錄賬號和密碼
- 5.檢測瀏覽器是否關閉了cookie
- 6.將資料寫入cookie
- 7.顯示瀏覽次數
- 8.只顯示一次彈出式窗口
- Document
- 1.查看網頁屬性
- 2.查看網頁源文件
- 3.查看指定網頁的源文件
- 4.打開'頁面設置'對話框
- 5.打印網頁
- 6.導出'收藏'
- 7.導入'收藏'
- 8.防止網頁被他人加入葉框
- 9.更換內置頁框的內容
- 10.回到瀏覽器首頁
- 11.將連接的頁面顯示在右葉框
- 12.將網頁設定成桌面項目
- 13.將網頁加入收藏
- 14.將網頁設為首頁
- 15.另存網頁
- 16.滿天星背景
- 17.上一頁/下一頁
- 18.前往指定頁
- 19.取得屏幕的色彩品質
- 20.使用百葉窗效果來切換網頁
- 21.同時卷洞兩個頁框
- 22.為網頁訪問設置時間限制
- 23.顯示“整理收藏夾
- 24.顯示網頁最后的更新時間
- 25.顯示瀏覽器訪問過的網站數
- 26.語言首選項
- 27.載入網頁進度條
- Window
- 1.不能改變窗口大小
- 2.不能最小化窗口
- 3.窗口從天而降效果
- 4.窗口自動鄉下卷動
- 5.窗口縮小效果
- 6.窗口自動向右卷動
- 7.彈出多個窗口
- 8.彈出廣告窗口
- 9.彈出式窗口
- 10.彈出一個頂層窗口
- 11.彈出一個居中顯示的窗口
- 12.彈出一個全屏窗口
- 13.彈出一個無屬性欄的窗口
- 14.彈出一個新窗口
- 15.彈出一個自動關閉窗口
- 16.改變窗口滑塊樣式
- 17.改變瀏覽器地址顯示的圖標
- 18.關閉窗口
- 19.將彈出式窗口資料輸入的主窗口
- 21.警告對話框
- 22.取得屏幕大小
- 23.取得瀏覽器大小
- 24.去掉窗口滑塊
- 25.全屏幕窗口
- 27.讓滑塊在窗口左邊出現
- 28.設定瀏覽器的窗口大小
- 29.使瀏覽器適合屏幕大小
- 30.是瀏覽器窗口顯示于屏幕中間
- 31.使瀏覽器窗口顯示于屏幕左側
- 32.使瀏覽器位于窗口右下角
- 33.輸入對話框
- 34.雙擊鼠標卷動窗口單機鼠標停止卷動
- 35.提示瀏覽器者更改分辨率
- 36.顯示網頁對話框
- 37.顯示網頁對話框-網頁對話
- 38.以頂層模式顯示對話框
- 39.允許調整彈出窗口的大小
- 40.在彈出的窗口中顯示標準按鈕
- 41.在彈出的窗口中顯示菜單
- 42.在彈出的窗口中顯示地址欄
- 43.在彈出的窗口中顯示滑塊
- 44.在彈出的窗口中顯示狀態欄
- 45.在彈出的窗口上關閉主窗口
- 46.在警告對話框中顯示多行信息
- 47.在主窗口上關閉彈出窗口
- 48.震動窗口
- 49.指定彈出窗口的位置
- 50.指定瀏覽器窗口的位置
- 文本
- 1.半透明文字
- 2.不斷變色的文字
- 3.產生漸變顏色的文字效果
- 4.從左至右搜索字符串
- 5.淡入淡出的文字效果
- 6.動感的loging文字
- 7.動感標題文字
- 8.動態縮放文字
- 9.發光特效文字
- 10.反彈文字
- 11.獲取部分字符串
- 12.取得字符串長度
- 13.取得字符串中指定文字的字符串
- 14.瀏覽者自己選擇文字顏色
- 15.瀏覽者自己選擇文字大小
- 16.閃爍文字
- 17.升降文字
- 18.使用指定的字符分割字符串
- 19.鼠標移上去來改變文字樣式
- 20.鼠標移上去來改變文字顏色
- 21.鼠標移上時文字顯示陰影
- 22.水波文字
- 23.搜索字符串
- 24.文字從左邊移動到右邊
- 25.文字來回反彈
- 26.陰影特效文字
- 27.影藏顯示文字
- 28.英文字母大小轉換
- 29.逐行顯示文字
- 30.逐字變換文字顏色
- 31.逐字顯示文字
- 其他
- 1.猜數字游戲
- 2.反轉文字
- 3.計算復利
- 4.檢查是否為閏年
- 5.取得網絡下載速度
- 6.在網頁之間傳遞參數
- 商務通
- 1.商務通核心教程
- 2.商務通跳轉代碼(php和html兩個版本)
- 3.商務通打開對話窗口容錯代碼
- 4.商務通隱藏默認邀請框代碼
- 5.商務通軌跡代碼未加載出來前執行的打開商通對話的函數
- 6.**不錯的base.css
- 7.獲取百度搜索關鍵詞
- 8.商務通隱藏代碼
- Jquery
- 1.選擇器,過濾器
- 2.屬性操作與樣式操作
- 3.DOM操作
- 4.$與對象
- 5.each()
- 6.this與$(this)
- 7.DOM事件操作
- 8.動畫
- 9.Ajax
- 雜項
- 二維碼API接口
- 小程序項目
- 印象筆記
- 1.首頁
- 2.待辦事項管理頁