tacky4
@tacky4 (Tacky4 .)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

window.onload が読み込まれない。

解決したいこと

該当ページのjavascriptが他のページから移動した(アクセスした)ときに読み込まれるようにしたい。

状況

RubyonRailsで地域選択画面で県と市が連動したプルダウンメニューを作っています。
ところが、プルダウンの選択肢が、
①他のページからアクセスしたときには読み込まれず、
②再読み込みをするときちんと読み込まれる、
というエラーが発生しています。

おそらく読み込みのタイミングの問題と思うのですが、今の自分の知識では分かりませんでした。
どなたか解決策をご存知の方がいれば、教えていただけないでしょうか?

①他のページから移動してくると読み込まれない

スクリーンショット 2021-09-26 13.09.42.png

②再読み込みすると読み込まれる

スクリーンショット 2021-09-26 13.09.50.png

問題のHTMLコード

search.html.erb
<div>
  <select id="selPref" onchange="selPref(this);"></select>
  <select id="selCity"></select>
</div>

<script>
//都府県の選択肢
var arr = [
  {cd:"", label:"▼都府県選択"},
  {cd:"13", label:"東京都"},
  {cd:"23", label:"愛知県"},
  {cd:"27", label:"大阪府"}
];

//市区の選択肢
var arrTokyo = [
  {cd:"", label:"▼区選択"},
  {cd:"1", label:"新宿区"},
  {cd:"2", label:"千代田区"},
  {cd:"3", label:"中央区"}
];
var arrAichi = [
  {cd:"", label:"▼市選択"},
  {cd:"1", label:"名古屋市"},
  {cd:"2", label:"豊橋市"},
  {cd:"3", label:"岡崎市"},
  {cd:"4", label:"豊田市"},
  {cd:"5", label:"一宮市"}
];
var arrOsaka = [
  {cd:"", label:"▼市選択"},
  {cd:"1", label:"大阪市"},
  {cd:"2", label:"堺市"},
  {cd:"3", label:"東大阪市"},
  {cd:"4", label:"枚方市"},
  {cd:"5", label:"豊中市"},
  {cd:"6", label:"吹田市"},
  {cd:"7", label:"高槻市"}
];

//都府県コンボの生成
window.onload=function(){
  for(var i=0;i<arr.length;i++){
    let op = document.createElement("option");
    op.value = arr[i].cd;
    op.text = arr[i].label;
    document.getElementById("selPref").appendChild(op);
  }
}

//都府県が選択された時に呼び出される処理
function selPref(obj){
  var targetArr;
  if(obj.value == "13"){
    targetArr = arrTokyo;
  }else if(obj.value == "23"){
    targetArr = arrAichi;
  }else if(obj.value == "27"){
    targetArr = arrOsaka;
  }else{
    targetArr = new Array();
  }
  var selObj = document.getElementById('selCity');
  while(selObj.lastChild){
    selObj.removeChild(selObj.lastChild);
  }
  for(var i=0;i<targetArr.length;i++){
    let op = document.createElement("option");
    op.value = targetArr[i].cd;
    op.text = targetArr[i].label;
    selObj.appendChild(op);
  }
}


</script>

参考(application.html.erbとapplication.js)

application.html.erb
 <head>
    <title>都市選択</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">

    <!--追記(slickを読み込んでありますが、おそらく関係ないと思います。)-->
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
    <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css"/>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
    <script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>

  </head>
application.js
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.

//= require jquery
//= require rails-ujs
//= require jquery.turbolinks
//= require activestorage
//= require turbolinks
//= require_tree .
0

1Answer

turbolinksをやめるか、jQueryで書くか、turbolinks:loadイベントを使うかだと思います。

0Like

Comments

  1. @tacky4

    Questioner

    ありがとうございます!
    turbolinksを消したらすぐ上手くいくようになりました。
    動作に問題も見られないのでこのまま続けていきます。

Your answer might help someone💌