• ベストアンサー

UserScriptで無名関数を書き換えることは出来ますか?

setInterval()で自身を定期的に呼び出す関数があるとします。 その処理を止めたい場合、関数オブジェクトにnullを代入するか、もしくはclearInterval()を使うことで止めることができます。 しかし無名関数でなおかつTimerIDが指定されていない場合、この処理を止める方法はあるでしょうか。 UserScriptなのでページ内のスクリプトを全て実行した後で動作するものとします。 無名関数を書き換えることが出来れば解決しそうなのですが・・・

  • skdl
  • お礼率100% (1/1)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

関数をnullにしたところでsetInterval(null, 100)のような形の呼び出しが続けられると思います。 TimerIDは1以上の数値(setInterval、setTimeOutを呼び出した順番の連番)なので、 適当に for(var i=1;i<100;clearInterval(i++)); などとすれば、もしかしたら止まるかもしれません。 タイマーがいくつか動いていたら、全部止めてしまいますが。

skdl
質問者

お礼

ありがとうございます。 setInterval()を新しく呼び出し、その戻り値を確認することでタイマーIDを推測することが出来ました。 ただ、タイマーIDはアクセスするたびに毎回変動するようなので、ピンポイントで的中させるのは難しいですね。 おっしゃる通り他のタイマーまで止まってしまいます。 もう少し試行錯誤してみます。

関連するQ&A

  • setTimeoutあるいはsetIntervalの限界

    いつもお世話になっています。 タイマーの実験をしてみようかと思い、タイマー関数のサンプルをちょっと触ってみて、気になることがありました。 スクリプトとしては、次のようなものです。 <HTML> <HEAD> <SCRIPT Language="JavaScript"> <!-- timerID = 10; count = 0; function timerX(){ status = "Counter is " + count++; } function clr(){ clearInterval(timerID); } // --> </SCRIPT> <BODY bgColor="white" onLoad="timerID = setInterval('timerX()',1000);"> (以下略) このスクリプトを実行すると、1秒毎に1カウント増えていきますから、ステータスに表示される数値は10秒で10になります。 ですから、1を指定する、つまりsetInterval('timerX()',1);にすれば、論理上、10秒で10000になるはずですよね? ところが実際にステータスに出る数値はそうはならず、かなり低い数字になってしまいます。 そこで質問なのですが、setTimeoutまたはsetIntervalでタイマーを作る場合、ミリ秒はどのくらいまで有効なのでしょうか。 ひょっとして、マシンに依存するのでまちまちなのでしょうか。 経験等でご存じの方、お教えください。

  • clearIntervalの記述方法について

    よろしくお願い致します。 jQueryにて「setInterval」を使用して、オープニングムービー(?)のようなものを作りたいと思い、見よう見まねで下記のようなコードを作りました。 取りあえず動作するようになったのですが、繰り返し動作を止めるための「clearInterval」の使い方が分かりません。 この場合、どのようにコードを記述すればよいのでしょうか? お手数ですが、どうぞご教授下さいますようお願い致します。 $(document).ready(function(){ $("#A").fadeTo(0,0); $("#B").fadeTo(0,0); $("#C").fadeTo(0,0); var timerId1 = setInterval(function(){ $("#A").fadeTo(1000,1); var timerId2 = setInterval(function(){ $("#B").fadeTo(1000,1); var timerId3 = setInterval(function(){ $("#C").fadeTo(1000,1); }, 1000); }, 1000); }, 1000); });

  • 即時関数で

    即時関数(無名関数)でsetTimeoutを繰り返す方法はありますでしょうか?setIntervalではなく。 var testDo=function(){ setTimeout(function(){ 何かの処理 testDo(); //★実行されない },600); }(); //即時関数 即時なのでtestDoという名前も不要だと思いますが。。。 よろしくお願いします。

  • スライドの表示とアクションスクリプトの関連

    こんにちわ。 現在、プレゼン風のスライドを作成しております。 親スライドがあり、その下に子スライドを数個作成しております。また、その子スライドにアクションを配置した仕様にしております。 また、アクションは、以前にこちらのサイトで教えていただきました、時間指定のアクションなのですが、子スライド2が表示されて数秒後に子スライド2内の指定のフレームに移動するアクションスクリプトを記述しています。というか、そういう風にしたいと想っています。 親スライド   |   子スライド1ー静止画   |   子スライド2-時間指定のスクリプト this.stop(); timerID = setInterval(startMovie, 28000); timerID2 = setInterval(startMovie2, 31000); function startMovie() { gotoAndPlay(5); clearInterval(timerID); } function startMovie2() { gotoAndPlay(10); clearInterval(timerID2); } 上記スクリプトは、子スライド2内の1フレーム目に記述しています。 また、各スライドの切り替えは、mediaDisplayのパラメーターで映像に合わせて、時間指定で切り替えています。 上記、スクリプトは稼動するのですが、スライド2が表示されてからではなく、全体が再生されてからの時間で動いてしまいます。 ですので、スライド1が表示されている裏でスライド2のアクションが動いてる感じです。 スライド2が表示されてから、アクションスクリプトが動くようになるには、どういう風に指定すればよいのでしょうか? ほかのとこでも聞いたのですが、ちょっと利き方が悪いのか、お返事がなくて。。。

  • 無名関数を使うメリットは何ですか?

    Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね? function func() { return "普通の関数です。"; } var func = function() { return "無名関数です。"; } なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ var func = function() { return "無名関数1です。"; } var func = function() { return "無名関数2です。"; } alert(func()); のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば window.onload = function() { alert("ウィンドウの読み込みが完了しました。"); } と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。 結局のところ、無名関数を使うメリットは何なのでしょうか?

  • 簡単なサンプルが動かないのはなぜ?

    超初心者です。 自力でがんばろうと、いろんなBBSの過去記事を除きやってるのですが 動きません。 たとえば //timerObjオブジェクトの設定 timerObj = new Object(); timerObj.timeout = function() { clearInterval(timerID); // インターバルの終了 }; //計測開始(5秒でタイムアウト) var timerID = setInterval(timerObj, "timeout", 5000); このようなサンプルを見つけ5秒間待つアクションを ちゃんとフレームアクションに入れました でも希望のとおり動きません。 初めは「制御」メニューのシンプルアクションをONにするのを知らずに やっていましたが、今は分かっています。 STOP(); だけのフレームアクションは利いていますので。。。 ちなみに //timerObjオブジェクトの設定 timerObj = new Object(); timerObj.timeout = function() { clearInterval(timerID); // インターバルの終了 stop(); }; //計測開始(5秒でタイムアウト) var timerID = setInterval(timerObj, "timeout", 5000); こうやってstop();をつけてもそこではとまりません。 シンタックスのエラーもないということは 何か設定かがおかしいのかもしれません。 もちろんキーフレームになっています。 もうちんぷんかんぷんです。 どなたかお助けを・・・・ VBAのソフト開発などはそれなりにしています。 なんでこんなこともわからんのか自己嫌悪になっております。

    • ベストアンサー
    • Flash
  • javascript無名関数から変数にアクセス

    お世話になります。 javascript初心者です。 無名関数からグローバル変数にアクセスしたいのですが 外で変数を宣言して、内でvar無しで代入してみたのですがうまくいきません どのようにすれば期待する結果になるのか、お忙しい中恐縮ですが 詳しい方お教えいただけないでしょうか //グローバル変数 var hoge; //dataTransfer処理省略 //html5のFileReader var reader = new FileReader(); reader.readAsDataURL(file); //ロードが完了したら無名関数にてhogeに結果を代入 reader.onloadend = function(e) {  hoge = e.target.result; }; alert(hoge); ■期待する結果 アラートで「結果」が表示される ■実際の結果 アラートで「」(空白)が表示される 無名関数内でalert(e.target.result);するとちゃんと結果が表示されるので FileReaderの処理は成功している模様です。 無名関数からグローバル変数にアクセスする方法を御存知の方 お教えいただけたら幸いです

  • 無名関数を実行する場合について

    テキストでonclickで無名関数を実行させるのに ; (セミコロン)を使う場合と使わない場合があるのですが、どちらでもイベントは実行されます。 この ; (セミコロン)は普通付けるのがいいのでしょうか。 それとも付けなくてもいいのでしょうか。 また、ある質問をした際に (無名関数init()が次に書かれたソースコードの下に書かれている場合) window.onload = init(); だとこの時点で実行されてしまうので、 window.onload = init; と書くべきだとアドバイスを受けました。 私がプログラムを実行した際に、init(); でも普通に実行されたので、 何故、initに()を付けてはいけないのかが分かりません。 回答者様には貴重なお時間を割いて頂く事に誠に申し訳ありませんが、アドバイスどうぞ宜しくお願い致します。

  • TimerProc コールバック関数を利用する方法

    タイマを使いたくてメッセージマップでOnTimerを追加しましたが、 CWnd::SetTimerの第3パラメタに何を設定したらよいかわかりません。 lpfnTimer WM_TIMER メッセージを処理するためのアプリケーションが用意した、 TimerProc コールバック関数のアドレスを指定します。 このパラメータが NULL の場合は、WM_TIMER メッセージはアプリケーションの メッセージ キューに置かれ、CWnd オブジェクトによって処理されます。 とあり、NULL指定のサンプルはあるのですが、 「TimerProcコールバック関数のアドレスを指定する法」を試したいのです。 関数のアドレスというのが何をいっているのか理解できないのですが 試しに void CXXXCtrl::method1() { SetTimer(timerID, 10000, &OnTimer); } void CXXXCtrl::OnTimer(UINT nIDEvent) { // 処理 COleControl::OnTimer(nIDEvent); } としたところ error C2276: '&' : 仮想関数のアドレスを取ろうとしました。 のエラーになってしまいます。

  • スライドプレゼンテーション機能を使ったときのボタンでのスライド移動

    こんにちわ。 FLASH8のスライドプレゼンテーション機能を使用して、映像とリンクしたプレゼンテーションを作成しています。 仕様としては、各スクリーンにフレームアクションを作成し、 各スクリーンにスクリプトを記述し、フレームを時間制御しています。 スクリーンの時間制御スクリプト: on (reveal) { timerID3 = setInterval(startMovie3, 31000); timerID4 = setInterval(startMovie4, 38000); function startMovie3() { trace("31秒待った"); trace([currentSlide, currentSlide.gotoNextSlide]); // 確認用に追加 rootSlide.currentSlide.gotoAndPlay(10); clearInterval(timerID3); } function startMovie4() { trace("38秒待った"); trace([currentSlide, currentSlide.gotoNextSlide]); // 確認用に追加 rootSlide.currentSlide.gotoAndPlay(15); clearInterval(timerID4);} } 上記をスクリーンに記述して、各スライドのフレームを制御しています。状況としては、こんな感じなのですが、問題は、一度ボタンでスライドを移動し、そのスクリプトの全ての時間指定が終了する前に、違うスライドへボタンで移動した場合、前のスライドのスクリーンに記述した時間指定のスクリプトも一緒に裏で動き前のスライドに記述した時間にあわせて、現表示されているフレームも稼動してしまいます。 トレースの状況としては、 28秒待った _level0.bg.controls.slide02,[type Function] 31秒待った _level0.bg.controls.slide02,[type Function] 37秒待った null,undefined 38秒待った _level0.bg.controls.slide02,[type Function] 一度スライドをボタンで選択しても、違うスライドを選択した時点で前のスライドのスクリプトを無効なりに制御する方法はありませんでしょうか?何卒、よろしくお願いいたします。

専門家に質問してみよう