~~~
<?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.待办事项管理页