PHP Ajax 跨域问题最佳解决方案

本文通过设置Access-Control-Allow-Origin来实现跨域。

例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com。

如果直接使用ajax访问,会有以下错误:

XMLHttpRequest cannot load http://server.runoob.com/server.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://client.runoob.com' is therefore not allowed access.

1、允许单个域名访问

指定某域名(http://client.runoob.com)跨域访问,则只需在http://server.runoob.com/server.php文件头部添加如下代码:

header('Access-Control-Allow-Origin:http://client.runoob.com');

2、允许多个域名访问

指定多个域名(http://client1.runoob.com、http://client2.runoob.com等)跨域访问,则只需在http://server.runoob.com/server.php文件头部添加如下代码:

$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';  
  
$allow_origin = array(  
    'http://client1.runoob.com',  
    'http://client2.runoob.com'  
);  
  
if(in_array($origin, $allow_origin)){  
    header('Access-Control-Allow-Origin:'.$origin);       
} 

3、允许所有域名访问

允许所有域名访问则只需在http://server.runoob.com/server.php文件头部添加如下代码:

header('Access-Control-Allow-Origin:*'); 

用了16款考研刷题app,就一两款好用,心好累

可考点、可随机、可刷套卷,有笔记、收藏、错题本,有计时,有手写蒙版打草稿

1.我是在职考研,选择刷题app,利用日常工作和通勤的间隙刷一刷。

2.主要用于刷管理类联考(管综),历年真题。

3.比较推荐的app有

MBA大师:可考点、可随机、可刷套卷,有计时,有错题集锦也可收藏题反复刷,做题时有手写蒙版打草稿,贴心。(缺点是只能全部做完提交才能看答案)(如下图)

粉笔考研:可刷套卷,可随机,可智能组合,有计时,有错题集锦也可收藏题反复刷,还有笔记和历史记录可查,做题时有手写蒙版打草稿,贴心。 (缺点是不能单独刷考点)

4.可以用用的

考研全题库:可考点、可随机、可刷套卷,有笔记、收藏、错题本,有计时,有手写蒙版打草稿(缺点是真题只更新到2018年)

5.不推荐

考研汇:之前最喜欢的一款,因为可以一道题一道题的刷(充分利用碎片时间),不需要等到刷完了提交才能看答案。可考点、可随机、可套卷、有计时,可收藏、有笔记,有错题本。(缺点是真题有乱码,有的题干表格无法显示,跟客服反馈没有任何回应)刷真题遇到几次题干有错误,无语(如下图)

考研准题库:可考点、随机、刷套卷,有笔记、收藏、错题本,有计时(缺点:没有蒙版打草稿,免费的真题只有4套,升级题库需要付费,且注册完了没一会 就有人打电话过来叫我报班

小西考研:可智能、可随机、可刷套题,有错题本、有收藏、有笔记(缺点:考点练习打不开,没有草稿蒙版。)

考研帮:刷题大部分功能都有,没有蒙版草稿功能(缺点:真题题库只更新到2017年)

掌上考研:主要是提供咨询,没有找到刷题的地方。

考虫:是上课的,没有找到刷题的地方。

研途考研:只有政治题,app会跳转到微信小程序刷题(不明白app存在的意义)

考研通:支付宝一键登录,还要验证手机,我觉得不安全,直接放弃了登陆,就用不了了。

师兄帮帮:拍照搜题用的,没有题库。

太府考研:属于咨询上课类型的,不能刷题。

橙啦:以英语为主,听课用的,练习科目没有管综,再见!

考研派:题库只有英语、政治,且真题题库只更新到2017年,再见!

口袋题库考研:专门刷题的app,啥都收费,它没什么不好,是我不好,我穷。(如下图)

php去除换行(回车换行)的三种方法


<?php   
 //php 不同系统的换行  
//不同系统之间换行的实现是不一样的  
//linux 与unix中用 \n  
//MAC 用 \r  
//window 为了体现与linux不同 则是 \r\n  
//所以在不同平台上 实现方法就不一样  
//php 有三种方法来解决  

//1、使用str_replace 来替换换行  
$str = str_replace(array("\r\n", "\r", "\n"), "", $str);   

//2、使用正则替换  
$str = preg_replace('//s*/', '', $str);  

//3、使用php定义好的变量 (建议使用)  
$str = str_replace(PHP_EOL, '', $str);   
?>  

Markdown image 替换为 html标签

使用Typora可以实现公式的预览,图片自动上传到服务器,但图片是markdown语法,这里实现从Markdown 转化为 Html的 img标签

public static function imageReplace($content)
{

	$pattern = ['/!\[img\]\((.*)\)/U','/<p>\s*<\/p>/U'];

	$replacement = ['<img src="\\1" \/>','']; 

	return preg_replace($pattern, $replacement, $content);

}

实现键盘相关操作

想要实现在写作时作用Enter来提交,作用Ctrl+S保存

    document.onkeydown=keyDownSearch;
   
    function keyDownSearch(e) { 
        // 兼容FF和IE和Opera 
        var theEvent = e || window.event; 
        var code = theEvent.keyCode || theEvent.which || theEvent.charCode; 
        if (code == 13) {  
            $("#todo-btn").trigger('click');
            return false; 
        } 
        return true; 
    }

解决动态ajax/pjax加载mathjax不生效问题

<!DOCTYPE html>
<html>
<head>
<title>MathJax TeX Test Page</title>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script>
<script type="text/javascript" async
  src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML">
</script>
</head>
<body>
When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are
$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$
</body>
</html>

只要引入mathjax的js地址,配置config,就能自动识别文章中的数学公式写法。显示效果如下:

正常情况下使用,是可以实现显示数学公式的,但是如果你的页面使用了动态加载,即ajax或pjax的情况下,mathjax就不能顺利的渲染出数学公式了。

咳咳,解决动态适配的事情也不是一次两次了,添加事件可以用jquery的on方法委托。在动态调用后执行可以在$.ajax的success方法后执行相关业务逻辑。 pjax则在complete或end后执行相关业务逻辑代码。这里我拿pjax做演示,代码类似下面:

$(document).pjax('a[target!=_top]', '#page', {
    fragment: '#page',
    timeout: 8000,
}).on('pjax:send', function () {
    do something
}).on('pjax:complete', function () {
    $.getScript("//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML", function() {
        MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
    });
});

想法是在pjax加载complete之后加载mathjax的js依赖,在配置config,因为之前正常使用也是这样的。但是很遗憾,还是没有正常显示。

后来锲而不舍的找到了MathJax.Hub.Typeset()这个方法,结合Queue方法就能实现(不要问我为啥是中文文档,谷歌翻译了解下)

....
.on('pjax:complete', function () {
    $.getScript("//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML", function() {
        MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
        // entry-content是文章页的内容div的class
        var math = document.getElementsByClassName("entry-content")[0];
        MathJax.Hub.Queue(["Typeset",MathJax.Hub,math]);
    });
});

Katex使用记录

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.15.1/dist/katex.min.css" integrity="sha384-R4558gYOUz8mP9YWpZJjofhk+zx0AS11p36HnD2ZKj/6JR5z27gSSULCNHIRReVs" crossorigin="anonymous">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.15.1/dist/katex.min.js" integrity="sha384-z1fJDqw8ZApjGO3/unPWUPsIymfsJmyrDVWC8Tv/a1HeOtGmkwNd/7xUS0Xcnvsx" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.15.1/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"></script>
<script>
    document.addEventListener("DOMContentLoaded", function() {
        renderMathInElement(document.getElementById('test'), {
          // customised options
          // • auto-render specific keys, e.g.:
          delimiters: [
              {left: '$$', right: '$$', display: true},
              {left: '$', right: '$', display: false},
              {left: '\\(', right: '\\)', display: false},
              {left: '\\[', right: '\\]', display: true}
          ],
          // • rendering keys, e.g.:
          throwOnError : false
        });
    });
</script>

以上代码可以实现公式的渲染,但不能在Ajax加载时渲染,在使用Ajax加载时去除DOMContentLoaded监听即可