2

現在、CMSやPHPを使用できない場所と契約していますが、HTMLやJavaScriptを使用してCMSのようなものを構築してほしいとのことです。

ばかげているように聞こえますが、最近は別の仕事を探したくありません。彼らは私がこれまで働いた中で最も素晴らしい人々であり、私は年をとっています。

CMSの概念の1つは、いつでも含めることができるグローバルファイルを用意することです。

その結果、$。ajax、$。getなどを試しましたが、Access URIが拒否されたり、現在のディレクトリの1つのディレクトリレベルであるファイルを読み込もうとしたりする問題が発生していました。

古いXMLHttpRequest/ActiveXObjectを使用して、javascriptファイルをロードすることができました。

ただし、ロードされたdiv内のスクリプトを呼び出すことはできません。divにロードされた関数の名前である「変数が見つかりません:mFunc」というエラーが表示されます。

これが私のhtmlのコードです:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>retrieve local file one level up</title>
<script type="text/javascript">
<!--
var createRequestObject = function(){   
    var req;

    if(window.XMLHttpRequest){
        // Firefox, Safari, Opera...
        req = new XMLHttpRequest();
    }else if(window.ActiveXObject){
        // Internet Explorer 5+
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        alert('There was a problem creating the XMLHttpRequest object');
    }   
    return req; 
}

    // Make the XMLHttpRequest object
    var http = createRequestObject();


var sendRequestPost = function(){
    var jscript = '../test.js';
    // Open PHP script for requests
    http.open('GET', jscript);
    http.setRequestHeader('Content-Type', 'text/javascript');
    http.onreadystatechange = handleResponsePost;
    http.send(null);
    var mT = setTimeout("mFunc()", 2000);
}

var handleResponsePost = function(){
    if(http.readyState == 1){
        document.getElementById('mDiv').innerHTML = "Please wait, loading... " ; 
    }else if(http.readyState == 4 && http.status == 200){
        // Text returned from PHP script
        var response = http.responseText;
        document.getElementById('mDiv').innerHTML = response;

        if(response){
            // Update ajaxTest2 content
            document.getElementById('mDiv').innerHTML = response;
        }
    }else if(http.readyState == 2){
        document.getElementById('mDiv').innerHTML = http.responseText;
    }else if(http.readyState == 3){
        document.getElementById('mDiv').innerHTML = http.responseText;
    }
}
-->
</script>
</head>

<body onload="javascript:sendRequestPost();">
<div id="mDiv"></div>
</body>
</html>

これがmDivにうまくロードされるjavascriptです:

<script type="text/javascript">
<!--
var mFunc = function(){
    var mScript = document.createElement("script");
    mScript.setAttribute("type","text/javascript");
    var data = 'alert("gets here");'
    mScript.text = data;

    var head = document.getElementsByTagName("head")[0];
    head.appendChild(mScript);
}
-->
</script>

それでも、2秒が経過すると、エラーが発生します。

おそらくブラウザがこれをdiv内のテキストとして認識しているためだと確信しているので、それがjavascriptであることを認識させるにはどうすればよいですか。

使用したくないevalを使用しようとしましたが、解析エラーが返されます。

前もって感謝します

4

2 に答える 2

1

../ローカルファイルシステム(ほとんどのプラットフォーム)には意味がありますが、HTMLやほとんどのWebサーバーには意味がありません。URLはサーバーの単なるクエリ文字列であることに注意してください。

一般的に、不要ないくつかの要素を削除するには、URLを解析する必要があります。ただし、Webサイト全体で共通のスクリプトが必要な場合は、ルートから参照する必要があるため、相対URLは。で始まります/

簡単なハックは/(.*)\/.*/.exec( '/foo/bar/baz.html' )[1]。これは、クエリ文字列のフォロー?やアンカーのフォローを処理しません#が、静的なWebサイトにはクエリがなく、より高度なテクニックを習得するまでアンカーはありません。jQueryには、正規表現に基づいてURLを解析するための優れたユーティリティがあります。

このサイトではトピックから外れていますが、JavaScript CMSを実装するには、XHR精通している必要があります。

于 2012-12-09T05:08:14.430 に答える
0

OK、私が一緒に働いている別のプログラマーは、簡単な解決策を見つけました。

代わりに、ajaxを使用して上位のディレクトリレベルからJavaScriptファイルをロードし、document.writelnまたはdocument.getElementById( "someDiv")。innerHTMLを実行してください。手順を逆に実行してください。

通常どおりにJSファイルを含めます。

<script type="text/javascript" src="../../common/header.js"></script>

このJSファイル内

function CommonHeader(mPath) {
    document.writeln('<header>');
    document.writeln('  <div class="PageWidth">');
    document.writeln('      <h1><a href="' + mPath + 'index.html"     title="Something">Something<sup>&reg;</sup></a> <a  href="http://www.xyz.com/abc.html" title="Learn more about us."><em>Learn about us</em></a></h1>');
    document.writeln('      <nav>');
    document.writeln('          <ul>');
    document.writeln('              <li id="loginOut"></li>');

プロセスの開始時にdocument.writelnを呼び出す順序である必要があります。

これで、header.js、footer.js、およびロードしたいその他のファイルをロードできるようになりました。また、各ページの上部に、これらのファイルへのパスを示す配列があり、ディレクトリレベルの低いHTML用になっています。

dynamicPathArr[0] = "../../";

次に、どのファイル内でも、関数を呼び出して日付をページに書き込むことができます

<script type="text/javascript">CommonHeader(dynamicPathArr[0])</script>

この完全に単純な解決策を考えていなかったとは信じられません。

これはSEOに適したものではありませんが、すべてが完了するまで、1つの場所でヘッダー、フッター、ナビゲーションなどを更新する場合にのみ適しています。

そして、応答をありがとう

于 2012-12-13T23:34:12.063 に答える