<< 前のページ |

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

firefox+javascriptでエラー: setting a property that has only a getter (solved)

Firefoxのバージョンは 3.0.5。以下のコードで再現できる。あほみたいだけど一応。

var screen = 1;

"setting a property that has only a getter" の意味を考えると、 screenは getter しか持っていないのに値をセットしようとしたところ、 それは不可ってことでエラーとなったもよう。

この場合、オブジェクトとして予約されている screen を変数名に使っていたのがいけなかった。 よく分からなかったら alert() で調べられる。

alert(screen); //=> [Object Screen]
var screen = 1;

なので、この場合の解決策は「予約されていない変数名に変える」。

以上。

選択範囲を外部プログラムで加工するサクラエディタ用JScriptマクロの雛形

マクロ=JScript、加工用プログラム=Rubyスクリプト という組み合わせで書いてます。

Rubyスクリプトは引数にファイルのパス 1つだけを取り、結果を標準出力に出すようにします。

適当なので適宜改造してください。

2014-08-10 追記: gist にも置きました。最新版はこちらを見てください。
https://gist.github.com/sonota/75f2288b904446ba31c6

// selection-macro-template.js
// 2010-03-25


function checkPath( path ){
  if( ! path.match( /\\$/ ) ){
    path += "\\";
  }
  return path;
}


//================================


var envPath    = "C:\\ruby\\bin\\ruby.exe";
var macroDir   = "C:\\apps\\sakuraW_r1714\\macro\\";

macroDir = checkPath( macroDir );

var scriptPath   = macroDir + "XXXX.rb";
var tempFileSrc  = macroDir + "____temp_src.txt";
var tempFileDest = macroDir + "____temp_dest.txt";

var timeoutSec = 10;


//================================


var ForReading = 1;
var ForWriting = 2;

var wShell = new ActiveXObject( "WScript.Shell" );

var vbHide              = 0; //ウィンドウを非表示
var vbNormalFocus       = 1; //通常のウィンドウ、かつ最前面のウィンドウ
var vbMinimizedFocus    = 2; //最小化、かつ最前面のウィンドウ
var vbMaximizedFocus    = 3; //最大化、かつ最前面のウィンドウ
var vbNormalNoFocus     = 4; //通常のウィンドウ、ただし、最前面にはならない
var vbMinimizedNoFocus  = 6; //最小化、ただし、最前面にはならない
/*
 参考:
 1.10 プログラムを実行する、ファイルやフォルダを開く(Runメソッド)
 http://www.happy2-island.com/vbs/cafe02/capter00110.shtml
 */


//================================


function pathExists( varName, type ){
  var path = eval(varName);
  var fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var typeMsg;
  var result = true;

  switch(type){
  case "file":
    typeMsg = "ファイル";
    if( ! fso.FileExists( path ) ){
      result = false;
    }
    break;
  case "folder":
    typeMsg = "フォルダ";
    if( ! fso.FolderExists( path ) ){
      result = false;
    }
    break;
  default:
    wShell.Popup( "変数 type の指定が間違っています。" );
    return;
  }

  if( ! result ){
    wShell.Popup( typeMsg + ' "' + path + "\" が見つかりません。\n変数 " + varName + " のパス指定を確認してください。" );
    return false;
  }else{
    return true;
  }
}


//================================


function writeFile( path, content ){
  var fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var fout = fso.CreateTextFile( path );
  fout.WriteLine( content );
  fout.Close();
}


function readFile( path ){
  var fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var fout = fso.OpenTextFile( path, ForReading );
  var content = fout.ReadAll();
  fout.Close();
  return content;
}


//================================


function callFromSakuraEditor(){
  var macroPath  = ExpandParameter( "$M" ); // このマクロファイルのパス

  if(    ! pathExists( "envPath"   , "file"   )
      || ! pathExists( "macroDir"  , "folder" )
      || ! pathExists( "scriptPath", "file"   )
  ){
    return;
  }

  var selectedStr = GetSelectedString(0);
  var fso = new ActiveXObject( "Scripting.FileSystemObject" );
  if( fso.FileExists( tempFileSrc  ) ){ fso.GetFile( tempFileSrc  ).Delete(); }
  if( fso.FileExists( tempFileDest ) ){ fso.GetFile( tempFileDest ).Delete(); }

  writeFile( tempFileSrc, selectedStr );

  var commandStr = 'cscript "' + macroPath + '"';
  wShell.Run( commandStr, vbHide, true );

  insText( readFile( tempFileDest ) );

  if( fso.FileExists( tempFileSrc  ) ){ fso.GetFile( tempFileSrc  ).Delete(); }
  if( fso.FileExists( tempFileDest ) ){ fso.GetFile( tempFileDest ).Delete(); }
}


function callFromCScript(){
  var commandStr = 'cmd /c  ' + envPath + '  "' + scriptPath +'"  "'+ tempFileSrc + '"' ;
  var execObj = wShell.Exec( commandStr );

  // 処理が終了するか、またはタイムアウトするまで待つ
  var startSec = (new Date()).getTime();
  while( execObj.status == 0){
    WScript.Sleep( 500 );
    if( (new Date()).getTime() - startSec > timeoutSec * 1000 ){
      break;
    }
  }

  var result;
  if( execObj.exitCode == 0){
    result = execObj.StdOut.ReadAll();
  }else{
    result = execObj.StdErr.ReadAll();
  }
  writeFile( tempFileDest, result );
}


//================================


if( typeof Editor !== "undefined" ){
  callFromSakuraEditor();
}else if( typeof WScript !== "undefined" ){
  callFromCScript();
}else{
  wShell.Popup( "呼び出し元が不正です。" );
}


/* 
 参考:
 Rekisa 取扱説明書 サクラエディタとの連携
 http://hp.vector.co.jp/authors/VA017396/software/Rekisa/Manual/usage_SakuraEditor.html
 */



** ホームに戻る

<< 前のページ |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。