
這是我的排班表,功能是能把名單中的名字拖拉到排班中的格子裡
目前我已經可以拖拉進去,也可以移除,但有一個小瑕疵

就是拖進去後格子大小會改變,想請問這個部分該如何修改呢?
這是我的HTML
<div class="container-fluid">
    <div class="row">
        <!--床位排程資訊-->
        <div class="col-md-10 panel-right panel-20 cal">
            <div class="box box-primary ">
                <div class="box-header">
                </div><!-- /.box-header -->
                <div class="box-body ">
                    <div id="schTable">
                        <table id="dataTable" class="table table-bordered table-hover caltable" style="margin: 0px 0px;" ondrop="drop(event)" ondragover="allowDrop(event)">
                            <tbody id="dataTbody">
                                @foreach (string[] row in DateForHelper.getMonthArray(@Model.Year, 5))
                                {
                                    <tr>
                                        <th class="sch-left-th"></th>
                                        @foreach (string text in row)
                                        {
                                            if (!String.IsNullOrEmpty(text))
                                            {
                                                <th colspan="3" class="th-weekday"><span class="th-date">@text</span></th>
                                            }
                                            else
                                            {
                                                <th colspan="3" rowspan="3" class="th-weekday"></th>
                                            }
                                        }
                                    </tr>
                                    <tr>
                                        <th class="sch-left-th">時段</th>
                                        @foreach (string text in row)
                                        {
                                            if (!String.IsNullOrEmpty(text))
                                            {
                                                <th>早</th>
                                                <th>午</th>
                                                <th>晚</th>
                                            }
                                        }
                                    </tr>
                                    <tr>
                                        <th class="sch-left-th">排班</th>
                                        @foreach (string text in row)
                                        {
                                            if (!String.IsNullOrEmpty(text))
                                            {
                                                <td id="spell-1"></td>
                                                <td id="spell-2"></td>
                                                <td id="spell-3"></td>
                                            }
                                        }
                                    </tr>
                                }
                            </tbody>
                        </table>
                    </div>
                </div>
                <!-- /.box-body -->
            </div>
            <!-- /.box -->
        </div>
        <!--醫師資訊-->
        <div class="col-md-2 panel-right panel-20 doc">
            <div class="box box-primary">
                <div class="box-header">
                </div><!-- /.box-header -->
                <div class="box-body">
                    <div class="lstdiv">
                        <table id="NameTable" class="table table-bordered table-striped table-hover">
                            <thead>
                                <tr>
                                    <th>名單</th>
                                </tr>
                            </thead>
                            <tbody id="NameTbody">
                                @if (Model.DrEmp.Count > 0)
                                {
                                    foreach (var item in Model.DrEmp)
                                    {
                                        <tr>
                                            <td class="fn-item td-draggable name" id="@item.DR_EMPNO" data name="@item.EMP_NAME" draggable="true" ondragstart="drag(event)">@item.EMP_NAME</td>
                                        </tr>
                                    }
                                }
                            </tbody>
                        </table>
                    </div>
                </div>
                <!-- /.box-body -->
            </div><!-- /.box -->
        </div>  <!-- /.col -->
    </div>
</div>
JS
    function allowDrop(ev) {
        ev.preventDefault();
    }
    function drag(ev) {
        ev.dataTransfer.setData("Text", ev.target.id);
    }
    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData("Text");
        var item = document.getElementById(data).cloneNode(true);
        ev.target.appendChild(item);
    }
    $('td[id^="spell-"]').click(function () {  
        $(this).empty();        
    })
                        你確定你真的是要 clone 整個 element 到表格裡嗎
還是說你只是需要他的text
如果只需要text的話
可以改成這樣
function drag(ev) {
    console.log(ev);
    // ev.dataTransfer.setData("Text", ev.target.id);
    ev.dataTransfer.setData("Text", ev.target.textContent);
}
function drop(ev) {
    ...
  // var item = document.getElementById(data).cloneNode(true);
  const item = document.createTextNode(data);
}
表格變形的話
你可能要從css下手
我目前看到可以用
word-wrap:break-word
然後調整 td size
不確定有什麼副作用就是
只要文字就好,像是我想拖拉222,我就只要222這個字就好
你的 code 我剛實測
會把整個 element clone過去唷
我上面的改法可以參考一下
可是我用你的方法反而不行耶?這還真奇怪
哪個部份不行![]()
我是用你的code改的說XD
沒事,是我的問題,我後來仔細看有幾個地方沒注意到
抱歉抱歉,感謝解答
不好意思,最後能否再問一個問題,我這作法能否改成JQUERY版本呢?
目前我改都暫時失敗
感謝解答
起問這個是用Draggable插件嗎?
老實說我原先也有做一個這版本
   $().ready(function (e) {       
      $('.fn-item').draggable({
          helper: "clone",
          cursor: "move"
      });
      $('td[id^="spell-"]').droppable({
          drop: function (event, ui) {       
              var source = ui.draggable.clone();
              $(this).append(source);
          }
      });     
  });
不過不知道為什麼不是很靈敏,有時候拖不進去,有時候又可以
我也是用 jquery ui 的唷
不過我不是直接拖 <td>
我是拖 <td> 裡面的 <span>
了解,那能否在請問,現在我需要用到AJAX
如果我需要再抓id="@item.DR_EMPNO"這個值的話
那這樣大概怎麼寫呢?
我的JS最初的寫法
ev.dataTransfer.setData("Text", ev.target.id);
var item = document.getElementById(data).cloneNode(true);
是顯示ID,不過沒有抓到text,換成您的則是反過來
抱歉問題有點多
由於我的id是設在 <td> 上
但是我拖的是 <span>
所以要抓到 id 的話
可以在 <span> 上 設 id
然後再利用
ui.draggable.prop('id');
就可以抓到
順帶一提
js的好處就是幾乎什麼都能 console.log 出來
不知道怎麼取值或是不知道有什麼prototype能用
console.log 出來就可以知道了
原來是這樣,難怪我都抓不到,我是用
$(this).attr('id')
那最後一個問題,如果是那個原本的JS版本呢?
我想做一個比對,能否麻煩您再為我解答一下呢?謝謝
// js version
function allowDrop(ev) {
  ev.preventDefault();
}
function drag(ev) {
  console.log(ev);
  // ev.dataTransfer.setData("Text", ev.target.id);
  ev.dataTransfer.setData("Text", ev.target.textContent);
}
function drop(ev) {
  ev.preventDefault();
  var data = ev.dataTransfer.getData("Text");
  // var item = document.getElementById(data).cloneNode(true);
  const item = document.createTextNode(data);
  ev.target.appendChild(item);
}
$('td[id^="spell-"]').click(function () {  
  $(this).empty();        
})
你是要問哪個部份呢
你原本就是傳id不是嗎?![]()
對,原本是傳ID,但是我不知道該怎麼取TEXT
然後換成您的做法後是取得TEXT但不知道該怎麼取ID@@
有點看不太懂
你是想要兩個同時都取值嗎
// set value
ev.dataTransfer.setData("ID", ev.target.id);
ev.dataTransfer.setData("Text", ev.target.textContent);
// get value
const myData = ev.dataTransfer.getData("Text");
const myId = ev.dataTransfer.getData("ID");
                    對,現在沒問題了,感謝,目前我應該剩AJAX部分,感謝
用table就有可能性這樣的問題發生。
一般來說。想要固定欄寬的情況下。你還是需要指定固定寬度處理。
這是table元件的通病,你沒招的。你只能用指定欄寬。
不過,其實一般會這樣跑掉的原因主要再於內部字元變動超過的情況。
但還有一種情況就是空元件問題。
因為這邊看不到你的html原始碼呈現的方式。不確定你是為會有如下的情況發生
<td></td>
<td></td>
<td></td>
一般像上面的情況就是說所謂的空元件。一但第一個td突然插入了一段文字或其它元件。
就會莫名的自動展開。
你可以將空字元先補上一個空白處理。如「 」
可以降低異位的情況發生。
不過這也只是降低。還是需要指定欄寬才行。
這樣喔,我是沒有空元件這個狀況發生,後來也就只好加寬欄位寬度了
能否離個題再詢問幾個問題?
1.這個拖拉的功能我也有用JQUERY的Draggable插件
可是卻很不靈敏
    $().ready(function (e) {       
      $('.fn-item').draggable({
          helper: "clone",
          cursor: "move"
      });
      $('td[id^="spell-"]').droppable({
          drop: function (event, ui) {       
              var source = ui.draggable.clone();
              $(this).append(source);
          }
      });     
  });
不知道這個疑問有沒有解?