- PR -

Javascript でコントロール名の取得

投稿者投稿内容
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-12-26 13:50
回答ではありませんが。
>string.Format("<script type='text/javascript'> {0} <" + "/script>"

この "<" + "/script>" エスケープはサーバコード内では不要です。

これが JavaScript 上で問題となるケースは以下のように書いたときだけです。
コード:
<script>
function registScript(func) {

   document.getElementById("xxx").innerHTML = 
       "<scr" + "ipt>" + func + "<" + "/script>";
}

function alertMessage() { alert("OK"); }

registScript(alertMessage);

</script>



このようなケースのとき、
"<scr" + "ipt>" + func + "<" + "/script>";
この部分の 閉じタグが </script> となっていると、
本来の閉じタグではないところで閉じタグと誤って解釈
してしまうのですね、IEのHTMLパーサーは。


>string.Format("<script type='text/javascript'> {0} <" + "/script>"
なお、サーバーコードでエスケープしても、これじゃ生成されるコードは
エスケープされませんよ。生成される時点では問題ないでしょうけど、
クライアントのHTMLパーサーのバグ?回避の術ですのでむやみな乱用は
難読コードになっちゃいますね。


SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-12-26 16:27
お世話になります。

どうもこのエラーは、string.Format("...{" 内に閉じカッコのない始まりだけのカッコがありエラーとなっていたようです。ヘルプにサンプルがあったため下記のように書き換えました。
ただ、cs.RegisterArrayDeclaration("LinkButtonIDs が吐き出すコードは、ページの終りのほうで、cs.RegisterClientScriptBlock(cstype,... は、ページの上部です。
そのためか、実行時に、「識別子がありません」というエラーメッセージが出ます。

コード:
LinkButton cb;
foreach (DataListItem dl in DataList1.Items)
{
  cb = (LinkButton)dl.FindControl("LinkButton1");
  // Register the array with the Page class.
  cs.RegisterArrayDeclaration("LinkButtonIDs", string.Concat("’", cb.ClientID, "’"));
}
// Check to see if the  script is already registered.
if (!cs.IsClientScriptBlockRegistered(cstype, csname))
{
   StringBuilder cstext = new StringBuilder();

   cstext.Append("<script type=text/javascript>\n");
   cstext.Append("var LinkButtonIDs;\n");
   cstext.Append("function DoCopy(var num) {\n");
   cstext.Append("     if(self.clipboardData) {\n");
   cstext.Append("         clipboardData.setData('text', document.all[LinkButtonIDs[num]].innerHTML);\n");
   cstext.Append("     }\n");
   cstext.Append("}\n");
   cstext.Append("window.onload = function() {\n");
   cstext.Append("     DoCopy(" + e.Item.ItemIndex.ToString() + ")\n");
   cstext.Append("}\n");
   cstext.Append("</script>\n");
   cs.RegisterClientScriptBlock(cstype, csname, cstext.ToString(), false);
}



また、cs.RegisterArrayDeclaration("LinkButtonIDs が吐き出すコードは、
下記の //<![CDATA[ のあたりで「文字が正しくありません」と出ます。

コード:
<script type="text/javascript">
//<![CDATA[
var LinkButtonIDs =  new Array(’DataList1_ctl00_LinkButton1’, ’DataList1_ctl01_LinkButton1’);
//]]>



これらのエラーについておしえてください。
また、「ぴあちゃん」に教えていただいた
> "<" + "/script>" エスケープはサーバコード内では
は、正しく動作しなかったので今回はつけたままにしました。
(途中で止まった)
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-12-27 01:18
>これらのエラーについておしえてください。

コード:

DoCopy(var num)


さすがにこれはダメダメ。強いてやるならば、
var num:int
だけど、Js2.0 の文法だからね。。。



>また、「ぴあちゃん」に教えていただいた
>> "<" + "/script>" エスケープはサーバコード内では
>は、正しく動作しなかったので今回はつけたままにしました。
>(途中で止まった)

激しく誤解しています。というか、"<"+"/script>" の意味を知らないで
使っていたんですね?


>cstext.Append("<script type=text/javascript>\n");
> cstext.Append("var LinkButtonIDs;\n");
> cstext.Append("function DoCopy(var num) {\n");
> cstext.Append(" if(self.clipboardData) {\n");

これもダメダメ。一概にダメダメとは言えないけど、スクリプトエラー
で悩んでいる時点でダメダメ確定かと。

動く実績を作ってからハードコーディングして下さい。
「手書き&動くであろう」な見切り発車で書いちゃうから実行時
エラーで壁にぶつかるんですよ。

コードの中にスクリプトを直接入れないで外だしにして下さい。
外だしか直接埋め込むかは意見が分かれるかもしれませんが、
現状、あなたの書き方を見ているとちゃんと動いた実績のある
ソースを作ってからそれをファイル化して、StreamReader 等
で読み込んでから利用するなどした方がミスの少ないコードが
書けるかと考えます。
リソースファイルとして xx.js を取り込むなり、xml の CDATA
セクション利用してJavaScriptパーツとして読み込むなり工夫
した方がいいでしょうね。
コード:

<JavaScript id="DoCopy" title="クリップボード経由のコピースクリプト">
[[CDATA
function DoCopy(num) {
//省略
}
]]
</JavaScript>


こんなXMLファイルこさえてリソースとして取り込んでそれをXMLReader
で読み込んでやったらいいかと思いますね。

で、肝心なのは、ASPXファイルの中で直接
コード:

<script>
function DoCopy(num) {
//省略
}
</script>


を書いて正しく動くことを確認してから、リソース化するなり
ハードコーディングすることです。
C#の文字列はダブルクオートで囲むので、JavaScriptのスクリプト
中にダブルクオートが使えなくなる、というか、クオートをエスケープ
しなくちゃならなくなるので面倒ですよね、C#のコードに埋め込むと。


コード:

<script>
function XXX(var num) {
alert(num);
}
XXX("OK");




とりあえず、これはエラーになりました。


[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-12-27 01:31 ]
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-12-28 13:01
お世話になります。

よくわからないのですが、下記のコードで急に動作するようになりました。
多少変更しましたが、理由はわかりません。

> 、"<"+"/script>" の意味を知らないで使っていたんですね?
というか、単なる閉じカッコという認識です。C#でいう”{”のようなもので
なければ、文法的にエラーになるので必要。と思っているだけです。
これって、大きく違います??

> xml の CDATAセクション利用してJavaScriptパーツとして....
調べてみたのですが、「スクリプト言語およびサンプルの XML や HTML を含める際に広く使用されています」とあるので、
RegisterArrayDeclaration や RegisterClientScriptBlock 的なもの?
ただ、これってサーバ側のコードとして記載するものですか?


コード:
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
	:
	:

   foreach (DataListItem dl in DataList1.Items)
   {
     LinkButton txtgrdValidate = (LinkButton)dl.FindControl("LinkButton1");
     cs.RegisterArrayDeclaration("LinkButtonIDs", String.Concat("'", txtgrdValidate.ClientID, "'"));
    }


    // Check to see if the  script is already registered.
    if (!cs.IsClientScriptBlockRegistered(cstype, csname))
    {
       StringBuilder cstext = new StringBuilder();

        cstext.Append("<script type=text/javascript>\n");
        cstext.Append("var LinkButtonIDs;\n");
        cstext.Append("function DoCopy(num) {\n");
        cstext.Append("     if(self.clipboardData) {\n");
        cstext.Append("         clipboardData.setData('text', document.all[LinkButtonIDs[num]].innerHTML);\n");
        cstext.Append("     }\n");
        cstext.Append("}\n");
        cstext.Append("window.onload = function() {\n");
        cstext.Append("     DoCopy(" + e.Item.ItemIndex.ToString() + ")\n");
        cstext.Append("}\n");
        cstext.Append("</script>\n");
        cs.RegisterClientScriptBlock(cstype, csname, cstext.ToString(), false);
    }

ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2008-12-28 14:05
引用:

SLさんの書き込み (2008-12-28 13:01) より:
> 、"<"+"/script>" の意味を知らないで使っていたんですね?
というか、単なる閉じカッコという認識です。C#でいう”{”のようなもので
なければ、文法的にエラーになるので必要。と思っているだけです。
これって、大きく違います??


大きく勘違いしていると思うね。それに「C#でいえば{」じゃなくて「}」だろうに・・・
閉じタグの意味だけで使っているならなぜ「"</script>"」と書かないの?
なぜ「"<" + "/script>"」とわざわざ書くのか説明できるかな?

エスケープという言葉の意味もわかっていないんじゃないの?
つーかぴあちゃんが丁寧に説明してくれている書き込みがあるのになぁ。
アウ
ベテラン
会議室デビュー日: 2008/12/18
投稿数: 72
投稿日時: 2008-12-29 17:02
(利用規約違反のため削除いたしました。@ITクラブメンバーシップセンター)
アウ
ベテラン
会議室デビュー日: 2008/12/18
投稿数: 72
投稿日時: 2008-12-29 17:03
(利用規約違反のため削除いたしました。@ITクラブメンバーシップセンター)
アウ
ベテラン
会議室デビュー日: 2008/12/18
投稿数: 72
投稿日時: 2008-12-29 17:09
(利用規約違反のため削除いたしました。@ITクラブメンバーシップセンター)

スキルアップ/キャリアアップ(JOB@IT)